text:
\section{Introduction}\label{sec:intro}
\input{section1}

\section{Related Works}
\input{section2}

\section{Performing Fair HAC}
\input{section3}

\section{Results}
\input{section4}

\section{Discussion}
\input{section5}

\section{Conclusion}
\input{section6}

\bibliographystyle{splncs04.bst}

\subsubsection{Motivating Example :}

We provide an example similar to the job shortlisting example given in \cite{deepak2020whither}, but tailor it to shortlisting households/individuals for bank credit promotions. A dataset, e.g., the \texttt{creditcard} dataset \cite{yeh2009comparisons}, is used by the marketing division of a bank to reach out to prospective customers and offer them loans and available credit opportunities. The dataset contains features such as the potential customer's age, their education level, their weekly work hours, and their capital gains per month. The bank utilizes a hierarchical clustering algorithm to find target audiences for promotional offers and uses the aforementioned attributes as input to the clustering algorithm. On running the algorithm, they obtain hierarchical \textit{clusters} of people. Since the cluster outputs are hierarchical the bank then chooses an appropriate $k$ number of clusters based on available credit opportunities. Out of these a small number of clusters are then shortlisted to be targeted for a particular promotion/offer. This shortlisting is undertaken by using some metrics, (e.g., the means of the education and wages-earned features in a cluster) to represent clusters and then select a few of them. It is important to note here that people-of-color (POC) as well as women, tend to earn lower wages than Caucasian males \cite{url1}, and that POC face more adversities that lead to  disparities in their education level \cite{url2} as opposed to white demographics. Now, considering these facts on the racial education divide and the wage gap, a clustering algorithm using these attributes will inherently group white households as well as men, as better candidates for better deals and offers (such as mortgages and loans) for each hierarchical level of clusters. As a result, this marketing clustering algorithm has \textit{disparate impact} on POC as well as women, as they are deprived of an  opportunity of improvement at each level of the hierarchy/cluster output. Therefore, it is important to study \textit{protected groups} (e.g., ethnicity and gender) and the corresponding fairness in such a hierarchical clustering setting. In this case, race/ethnicity and gender can be considered as \textit{protected groups} and the objective of the fair hierarchical clustering algorithm is to ensure that each group gets a certain minimum representation, for each promotion's target cluster, for some $k$ number of clusters. Moreover, no group should be overwhelmingly preferred, and thus there should also be a cap on the maximum representation allowed. This example demonstrates how \textit{bounded representation} mitigates disparate impact, specifically in the context of clustering. We would like our fair hierarchical clustering algorithm to output trees that abide by this notion of fairness.

The rest of the paper is organized as follows: Section 2 discusses related work in the field, Section 3 details our proposed algorithm for performing fair HAC, Section 4 describes our results on real data, Section 5 delineates an alternate approach to fair clustering, and Section 6 concludes the paper and discusses the scope of future work.

\subsection{Fair HAC: The FHAC Algorithm}
The goal for our fair algorithm will then be to minimize the fairness cost and ensure that at a level with some clusters, we have at least maintained some $\alpha'$-Proportional Fairness where $\alpha'$ is some constant value. We also run the algorithm till some $k$ clusters are remaining, and return after that. To enforce these constraints, we keep tightening the bound on proportional fairness and simultaneously keep loosening the bound on minimizing distance, as we start getting closer to $k$ clusters. The greedy Fair Hierarchical Agglomerative Clustering (FHAC) algorithm is described as Algorithm 1 (which works irrespective of the choice of linkage criteria). Algorithm 1 resembles the working of vanilla HAC except for some key distinctions that allow it to be fairer than traditional HAC. The key difference is in incorporating fairness constraints by foregoing the minimum distance linkage criterion constraint to allow for the selection of other clusters that can be merged, and lead to a fairer output tree. It is important to note that throughout, we maintain a distance matrix $\mathcal{D} \in \mathbb{R}^{n \times n}$ between clusters to improve the runtime of the algorithm, and this can be done by computing the distances using the linkage criterion provided as input. Also, $d_{\min}$ signifies the initialization of the distance (computed using the linkage criterion) between the clusters chosen to be merged for this level. Next, the proposed Algorithm 1 essentially tightens the fairness constraint (and loosens the distance constraint) as we keep constructing the clustering tree from bottom to top. The fairness constraint tightening is achieved using the function $\mathcal{Z}_{\alpha}: \mathbb{R} \rightarrow \mathbb{R}$ and the distance constraint loosening is achieved using the $\mathcal{Z}_{\beta}: \mathbb{R} \rightarrow \mathbb{R}$. $\mathcal{Z}_{\alpha}$ and $\mathcal{Z}_{\beta}$ are both monotonically increasing functions and are parameterized appropriately for the dataset $X$ (their parameterization is discussed later). We compute the actual constraint bounds $\alpha$ and $\beta$ using $\mathcal{Z}_{\alpha}(|C| - k)$ (line 6) and $\mathcal{Z}_{\beta}(n - |C|)$ (line 7), respectively, where $C$ in each iteration of the while loop (line 3) denotes the current state of clusters at some level of the tree. This can be understood intuitively-- if both functions are monotonically increasing, then $\alpha$ reduces as we get closer to $k$ clusters, tightening the fairness constraint, whereas $\beta$ increases as we get closer to $k$ clusters and thus, loosens the distance bound. We use $\mathcal{Z}_{\alpha}(x) = e^{\theta_1 x + \alpha_0}$ and $\mathcal{Z}_{\beta}(x) = e^{\theta_2 x + \beta_0}$ for our experiments and results, but any monotonic function can be used.

\begin{algorithm}[H]
\caption{Proposed FHAC Algorithm}
 \textbf{Input:} $X$, $F$, $k$, $D(.,.), \mathcal{Z}_{\alpha}: \mathbb{R} \rightarrow \mathbb{R}, \mathcal{Z}_{\beta}: \mathbb{R} \rightarrow \mathbb{R}$\\
 \textbf{Output:} Fair HAC tree $T_{fair}$
 \begin{algorithmic}[1]
 \State \textbf{set} $C \leftarrow X$
 \State \textbf{compute} $\mathcal{D}_{n_1,n_2} = D(n_1,n_2), \forall (n_1,n_2) \in X \times X$
 \While{$|C| \geq k$}
 \State  $P_g = 0$, $\forall g \in F$
 \State  $d_{\min} \leftarrow \infty$
 \State  $\alpha \leftarrow \mathcal{Z}_{\alpha}(|C| - k)$
 \State  $\beta \leftarrow \mathcal{Z}_{\beta}(n - |C|)$

 \For{each $(c_i,c_j) \in C \times C$,  \textit{s.t.} $c_i \neq c_j$}

 \For{each $g \in F$}

 \State $\delta_g^{c_i + c_j} \leftarrow \frac{\delta_g^{c_i}|c_i| + \delta_g^{c_j}|c_j|}{|c_i| + |c_j|}$

 \State \textbf{if} $|\delta_g^{c_i + c_j} - \phi_g| \leq \alpha$ \textbf{then} $P_g' = 1$, \textbf{else} $P_g' = 0$

 \EndFor

 \If{$\sum_{g \in F}P_g' \geq \sum_{g \in F}P_g $}
 \If{$d_{\min} + \beta > \mathcal{D}_{c_i, c_j}$}
 \State $d_{\min} \leftarrow \mathcal{D}_{c_i, c_j}$
 \State $P_g \leftarrow P_g', \forall g \in F$
 \State $(c_1^m, c_2^m) \leftarrow (c_i, c_j)$
 \EndIf
 \EndIf

 \EndFor

 \State \textbf{merge} $c_1^m \leftarrow c_1^m + c_2^m $
 \State \textbf{update} $C$ \textbf{with newly merged clusters}
 \State \textbf{recompute} $\mathcal{D}_{c_1,c_2} = D(c_1,c_2), \forall (c_1,c_2) \in C \times C$
 \State \textbf{update} $T_{fair}$ \textbf{with merge}
 \EndWhile
 \State \textbf{return} $T_{fair}$

 \end{algorithmic}
\end{algorithm}

Next, unlike traditional HAC algorithms, we now also maintain the proportion of protected group $g$ members for each possible cluster pair to be merged (line 10). Another distinction is the $P_g \in \{0,1\}^f$ and $P_g' \in \{0,1\}^f$ vectors, that help us keep track of how many protected groups for a potential cluster merge we have met the proportional fairness constraints for so far. If $P_g' = 1$ we have met the proportionality condition for group $g$ in this iteration, otherwise $P_g' = 0$. $P_g$ is the same but maintains global state-- that is, it keeps track of the same condition but for the \textit{best} cluster merge pair found so far. Thus, in line 11, we check to see if we have met $\alpha$-Proportional Fairness if clusters $c_i$ and $c_j$ were to be merged, and then appropriately set the value for $P_g'$. Next, once we have done this for all the groups (lines 9-12), we compare the current cluster pair with the \textit{best} cluster merge pair found so far (line 13). If the current cluster pair is a better choice, we proceed to checking for whether we improve on the minimum distance constraint (relaxed using $\beta$) on line 14, and then update variables accordingly. Gradually we build up the HAC tree and return it as $T_{fair}$.

\textbf{Note.} As is evident, Algorithm 1 achieves an asymptotic time complexity of $\mathcal{O}(fn^3)$ which is comparable to vanilla HAC ($\mathcal{O}(n^3)$) since $f$ is usually small for real-world applications. Also, in implementing Algorithm 1, we can further speed-up the clustering process by making locally optimal cluster merges as long as they meet the fairness (and distance) criteria, as opposed to searching the entire space of possible cluster pairs to merge. Furthermore, the benefit of employing Algorithm 1 for fair HAC, is that it can be utilized to minimize any cost function that is required for ensuring fairness of the hierarchical clustering process. In the previous section, we defined the MFC and balance for the level with $k$ clusters, which can be minimized by Algorithm 1 through appropriate parameterization of $\mathcal{Z}_{\alpha}$ and $\mathcal{Z}_{\beta}$. In the results section, we will present experimental results for both these fairness metrics, demonstrating the generality of our approach.

\textbf{Calculation of hyperparameters.} For our empirical results we let $\mathcal{Z}_{\alpha}(x) = e^{\theta_1 x + \alpha_0}$ and $\mathcal{Z}_{\beta}(x) = e^{\theta_2 x + \beta_0}$. Thus, we have to estimate the parameters $\alpha_0$, $\beta_0$, $\theta_1$, and $\theta_2$ that minimize MFC or balance. For the results in the paper, we utilize a simple grid-search and then choose parameters based on the values obtained for the choice of fairness cost. Alternatively, a black-box hyperparameter search algorithm can also be utilized for this purpose, such as \cite{Storn1997}.

We can now show how Algorithm 1 fares in terms of fairness compared with traditional HAC when optimized for MFC:

\begin{proposition}
\textit{For appropriately parameterized monotonically increasing functions $\mathcal{Z}_{\alpha}$ and $\mathcal{Z}_{\beta}$, Algorithm 1 computes a $T_{fair}$ that is more (or equivalently) fair to the vanilla HAC tree $T$, according to the chosen fairness cost metric (MFC or balance).}
\end{proposition}

\begin{proof}
Provided in the supplementary file.
\end{proof}

\iffalse
\begin{proof}
Let us first consider choosing the MFC as the cost. Given the fact that $\mathcal{Z}_{\alpha}$ is monotonically increasing and line 11 of Algorithm 1, it is evident that any of the $k$ clusters at the $k$-cluster level of $T_{fair}$ achieves at least $\mathcal{Z}_{\alpha}(0)$-Proportional Fairness. Therefore, Max Fairness Cost for $T_{fair}$ is bounded as:
\begin{align*}
    MFC(T_{fair}) &= \max_{i \in [k]}\sum_{g \in F}|\delta_g^{C_i} - \phi_g|\\
                &\leq  f \mathcal{Z}_{\alpha}(0)
\end{align*}

Thus, this is the maximum value of MFC that can be attained. However, for the case of vanilla HAC, unless the minimum distance clusters selected for merging also are the most optimal choice for enforcing fairness, the maximum MFC cannot be bounded. Moreover, since parameters of $\mathcal{Z}_{\alpha}$ and $\mathcal{Z}_{\beta}$ together minimize MFC for dataset $X$, we have:
\begin{align*}
    MFC(T_{fair}) \leq MFC(T)
\end{align*}

\end{proof}
\fi

\iffalse
\begin{figure}[H]
  \centering

    \includegraphics[scale=0.4]{b.png
  \caption{Vanilla HAC clusters on Toy Example}
\end{figure}%
\begin{figure}
  \centering

    \includegraphics[scale=0.35]{c.png}%
  \caption{FHAC clusters on Toy Example}
\end{figure}
\fi

\subsection{Results on Toy Data}
We generate two-dimensional data from a uniform distribution ($[0,250]$) for our toy example and there are $25$ points in total ($n$) and $k = 4$. Clusters are denoted in Figure 1 using 4 colors (red, green, blue, and yellow). Moreover, there are two protected groups, denoted by $\circ$ and $\times$, with ideal proportions denoted by $\phi_{\circ} = 0.56$ and $\phi_{\times} = 0.44$, respectively. Therefore, a fair distribution of protected groups across clusters should be to (more, or less) balance them, as $\phi_{\circ} \approx \phi_{\times} \approx 0.5$. Also, $\mathcal{Z}_{\alpha}(x) = \theta_1 x + \alpha_0$ and $\mathcal{Z}_{\beta}(x) = \theta_2 x + \beta_0$. As mentioned above, we run FHAC (Algorithm 1) iteratively and estimate hyperparameters, and then compare how fair the final clusters are for vanilla single-linkage HAC and single-linkage FHAC. The values of the parameters are as follows: $\alpha_0 = 1.0, \theta_1 = 5.0, \beta_0 = 11.031, \theta_2 = 0.1826$. Moreover, MFC for vanilla HAC with single-linkage is $1.12$, and for FHAC with single-linkage is $0.38$. Thus, we find that the fairness achieved by our algorithm is much better, and we obtain proportionally fair clusters as a result. The clusters for traditional HAC are shown in Figure 1(a), and for our proposed FHAC are shown in Figure 1(b). Visually, it is easy to see that clusters in Figure 1(b) are more well-balanced than in Figure 1(a), where the red cluster has a large number of points, and the yellow cluster has only 1 point. Figure 1(b) instead has all points from each of the two protected groups distributed according to their ideal proportions.

\begin{figure}[H]
\centering
\begin{subfigure}{.49\textwidth}
  \centering
    \includegraphics[scale=0.42]{figs/hc.pdf}
  \caption{Vanilla HAC clusters}
\end{subfigure}
\begin{subfigure}{.49\textwidth}
  \centering
    \includegraphics[scale=0.42]{figs/fhc.pdf}%
      \caption{FHAC clusters}
\end{subfigure}
\caption{Toy Example}
\end{figure}
\subsection{Datasets Used}

We have run our experiments for comparitive analysis of FHAC on the following three datasets obtained from the UCI ML respository. We subsample datasets ($n=1000$) much like previous work \cite{chierichetti2017fair} \cite{abraham2019fairness}. We let merges occur up to $k=4$ (that is, we start $1000$ singleton clusters and merge them till we have $4$ clusters and we have obtained a hierarchical cluster tree) for all experiments and all datasets. These datasets are utilized in most research to evaluate fair clustering algorithms \cite{chierichetti2017fair}, \cite{bera2019fair}:
\begin{enumerate}
    \item \textit{Default of Credit Card Clients Dataset} \cite{yeh2009comparisons}: This is the dataset of customers default payments in Taiwan, denoted as \texttt{creditcard}. The features used are \textit{age, bill-amt 1 — 6, limit-bal, pay-amt 1 — 6}. The sensitive attribute used is \textit{education} and the four protected groups are \textit{graduate school} ($\phi_0 = 0.25$), \textit{university} ($\phi_1 = 0.25$), \textit{high school} ($\phi_2 = 0.378$), \textit{others} ($\phi_3 = 0.122$).
    \item \textit{Bank Marketing Dataset} \cite{moro2014data}: This is a dataset related to the telephonic marketing campaigns of a Portuguese bank, denoted as \texttt{bank}. The features used are \textit{age, balance} and \textit{duration}. The sensitive attribute is \textit{marital status}, and the three protected groups are \textit{married} ($\phi_0 = 0.334$), \textit{single} ($\phi_1 = 0.334$), \textit{divorced} ($\phi_2 = 0.332$), respectively.
    \item \textit{Census Income Dataset} \cite{kohavi1996scaling}: This is a set of 14 attributes of adults obtained via a census survey in 1996, denoted as \texttt{census}. The features used are \textit{age, education-num, final-weight, capital-gain, hours-per-week}. The sensitive attribute is \textit{sex} and the two protected groups are \textit{male} ($\phi_0 = 0.376$), \textit{female} ($\phi_1 = 0.624$).
\end{enumerate}

\subsection{Comparison between FHAC (Algorithm 1) and Vanilla HAC}

The fairness results (including parameter values) for running Algorithm 1 and vanilla HAC over all the aforementioned datasets for different linkage criteria for MFC as the fairness metric are shown in Table 1. The lower the MFC, the more fair the obtained clustering is. The results when balance is selected as the fairness metric are shown in Table 2. Here, the higher the balance, the \textit{fairer} the clustering obtained. Clearly, Algorithm 1 achieves \textit{fairer} solutions to vanilla HAC on real data.

\begin{table}[ht!]
\caption{Comparison of MFC between Vanilla HAC and FHAC (Ours)}
\begin{center}
\tabcolsep=0.11cm
\begin{tabular}{|c|c|c|c|c|c|c|c|}%
\hline
Dataset & Linkage & $\theta_1$ & $\theta_2$ & MFC (Vanilla) & MFC (FHAC)\\
\hline
\hline
\texttt{census} & Average & 0.001 & 0.001 & \textbf{0.0853} & \textbf{ 0.0853}\\
\hline
\texttt{census} & Complete & 0.001 & 0.001 & 0.1806 & \textbf{0.0853}\\
\hline
\texttt{census} & Single & 0.001 & 0.65 & 1.248 & \textbf{0.752}\\
\hline
\texttt{creditcard} & Average & 0.00005 & 0.005 & 1.2439 & \textbf{1.0}\\
\hline
\texttt{creditcard} & Complete & 0.00005 & 0.005 & 0.744 & \textbf{0.60}\\
\hline
\texttt{creditcard} & Single & 0.0075 & 0.5 & 1.5 & \textbf{ 0.778}\\
\hline
\texttt{bank} & Average & 0.0001 & 0.05 & 1.332 & \textbf{0.6679}\\
\hline
\texttt{bank} & Complete & 0.5 & 0.05 & 1.332 & \textbf{0.4457}\\
\hline
\texttt{bank} & Single & 0.001 & 0.65 & 1.332 & \textbf{0.6653}\\
\hline
\end{tabular}
\end{center}
\end{table}

\begin{table}[ht!]
\caption{Comparison of Balance between Vanilla HAC and FHAC (Ours)}
\begin{center}
\tabcolsep=0.11cm
\begin{tabular}{|c|c|c|c|c|c|}
\hline
Dataset & Linkage & $\theta_1$ & $\theta_2$ & Balance(Vanilla) & Balance(FHAC)\\
\hline
\hline

\texttt{census} & Average & 0.001 & 0.001 &  \textbf{0.8865} & \textbf{0.8865}\\
\hline
\texttt{census} & Complete & 0.001 & 0.001 & 0.7599 & \textbf{0.8865}\\
\hline
\texttt{census} & Single & 0.0005 & 1.0 & 0.0 & \textbf{0.9385}\\
\hline

\texttt{creditcard} & Average & 0.05 & 0.1 & 0.0 & \textbf{0.427}\\
\hline
\texttt{creditcard} & Complete & 0.0005 & 1.0 & 0.0 & \textbf{0.7105}\\
\hline
\texttt{creditcard} & Single & 0.0005 & 1.0 & 0.0 & \textbf{0.7959}\\
\hline

\texttt{bank} & Average & 0.045 & 0.09 & 0.0 & \textbf{0.5567}\\
\hline
\texttt{bank} & Complete & 0.5 & 0.05 & 0.0 & \textbf{0.3327}\\
\hline
\texttt{bank} & Single & 0.0005 & 1.0 & 0.0 & \textbf{0.8099}\\
\hline

\end{tabular}
\end{center}
\end{table}

\subsection{Comparison between FHAC (Algorithm 1) and AFHAC}

In this subsection, we compare the performance of our proposed algorithm FHAC with AFHAC with regards to the fairness metric MFC and balance defined in Section 3. AFHAC works with the following hierarchical clustering objectives: Cohen-Addad et al's \textit{value} objective \cite{NIPS2017_d8d31bd7} and Moseley et al's \textit{revenue} objective \cite{10.1145/3321386}. Experiments were run to calculate MFC and balance of the clusters formed by AFHAC optimizing revenue (denoted as AFHAC-R) as well as value objectives (denoted as AFHAC-V).

The AFHAC algorithm proposed by Ahmadian et al utilizes average-linkage HAC as part of their clustering process \cite{ahmadian2020fair}. Thus, for comparisons to be justifiable, we compare their algorithm with our proposed FHAC algorithm with average-linkage as the linkage criterion. Another important consideration is the difference in fairness enforcement. The AFHAC algorithms aim to ensure that all clusters (and their merged sub-clusters) should have each protected group's proportion upper-bounded by some value $\alpha$ provided at runtime. Extrapolating for the level with $k$ clusters, it is then evident that their algorithms cannot accommodate different \textit{ideal proportions} for each group as they attempt to use only the same $\alpha$ for each group. Mathematically, they aim to ensure that $\delta_g^{C_i} \leq \alpha$, $\forall g \in F, i\in [k]$. Therefore, to make comparisons fair, we set $\alpha = \max_{g \in F}\{\phi_g\}$ for our experiments using their algorithms. We can then compare their approach with ours.

\begin{table}[ht!]
\caption{Comparison of MFC for FHAC (Ours), AFHAC-R, and AFHAC-V}
\begin{center}

    \tabcolsep=0.11cm
    \begin{tabular}{|c|c|c|c|}
        \hline
    Dataset  & MFC (FHAC) & MFC (AFHAC-V) & MFC (AFHAC-R)\\
    \hline
    \hline
    \texttt{creditcard} & \textbf{1.0} & 2.8505 & 1.5825 \\
    \hline
    \texttt{census} & \textbf{0.0853} & 4.0 & 4.0 \\
    \hline
    \texttt{bank} & 0.6679 & \textbf{0.03648} & 2.0027\\
    \hline
    \end{tabular}
\end{center}
\end{table}

We calculated MFC values for AFHAC-R and AFHAC-V on all the datasets mentioned in Section 4.1 and compare with Algorithm 1. These results are shown in Table 3. We do similar experiments for balance and show the results in Table 4. Observing both Table 3 and Table 4, we can see that we outperform both AFHAC-V and AFHAC-R for both the MFC and balance metrics for the \texttt{creditcard} and \texttt{census} datasets. For the \texttt{bank} dataset, we outperform AFHAC-R for both MFC and balance, but AFHAC-V has better results than ours. Despite this, we believe in the merits of our approach due to the lack of generalization capability of the AFHAC algorithms to any fairness notions, and their overall inconsistent performance on the other datasets.

\begin{table}[ht!]
\caption{Comparison of Balance for FHAC (Ours), AFHAC-R, and AFHAC-V}
\begin{center}

    \tabcolsep=0.11cm
    \begin{tabular}{|c|c|c|c|}
        \hline
    Dataset & Balance(FHAC) & Balance(AFHAC-V) & Balance(AFHAC-R)\\
    \hline
    \hline
    \texttt{creditcard} & \textbf{0.427} & 0.0 & 0.416 \\
    \hline
    \texttt{census} & \textbf{0.8865} & 0.2 & 0.0 \\
    \hline
    \texttt{bank} & 0.5567 & \textbf{0.9474} & 0.0\\
    \hline
    \end{tabular}
\end{center}
\end{table}

\subsection{Comparing Clustering Performance/Quality of Fair Clusters}

As a result of enforcing fairness constraints on a clustering, we are reducing the clustering quality compared to the original optimal clustering. This happens because we opt for more fair cluster merges over ones that minimize distance between clusters in Algorithm 1. That is, as we are improving fairness (either in terms of balance or MFC) for our proposed FHAC algorithm, we are reducing clustering performance compared to vanilla HAC. In our approach, this directly relates to increasing the $\beta$ relaxation of the distance criterion while finding pairs of clusters to merge together. Similarly, even for the AFHAC algorithms (and other fair algorithmic variants), clustering performance decreases at the cost of finding \textit{fairer} solutions.

Thus, in this subsection, we wish to analyze the clustering performance of our FHAC algorithm to the AFHAC algorithms. Considering the vanilla HAC clustering performance as the optimal, we obtain results to observe the extent to which clustering performance worsens and how it compares to the AFHAC algorithms. To measure clustering quality, we utilize the Silhouette Coefficient/Score \cite{ROUSSEEUW198753} which is a widely used clustering performance metric. It aims to capture intra-cluster similarity and inter-cluster dissimilarity and gives an output between $[-1,1]$ for a given clustering as input. A score of $-1$ indicates an \textit{incorrectly assigned} clustering and a score of $1$ indicates a \textit{dense and well-separated} clustering. A score of $0$ indicates \textit{overlapping clusters}.

\begin{figure}[H]
\centering\begin{subfigure}{0.49\linewidth}
\centering\includegraphics[scale=0.225]{figs/Silhouette-credit_better.pdf}
 \caption{Silhouette Scores for \texttt{creditcard}}
\end{subfigure}\hfill
\begin{subfigure}{0.49\linewidth}
\centering\includegraphics[scale=0.225]{figs/Silhouette-bank_better.pdf}
 \caption{Silhouette Scores for \texttt{bank}}
\end{subfigure}
\begin{subfigure}{\linewidth}
\medskip
\centering\includegraphics[scale=0.225]{figs/Silhouette-census_better.pdf}
 \caption{Silhouette Scores for \texttt{census}}
\end{subfigure}
\caption{Clustering Performance Analysis}
\end{figure}

Since we are comparing Silhouette Coefficients for fair clusters obtained via Algorithm 1 and the AFHAC algorithms, it does not make sense to compare clustering solutions that are explicitly unfair according to the fairness metric. In our work, this corresponds to solutions that have balance equal to $0$. Therefore, for any solutions such as these, we denote their Silhouette Score as $-1$ (incorrect clustering). The results comparing the Silhouette Scores for Algorithm 1 with average-linkage for MFC (denoted as FHAC(MFC)), Algorithm 1 with average-linkage for balance (denoted as FHAC(Balance)), AFHAC-V, and AFHAC-R, on the \texttt{creditcard}, \texttt{bank}, and \texttt{census} datasets are shown in Figure 2(a), Figure 2(b), and Figure 2(c), respectively.

\looseness-1 For Figure 2(a), we see that FHAC for both MFC and for balance outperforms the AFHAC algorithms in terms of performance. Moreover, the Silhouette Score for FHAC(MFC) and the vanilla HAC average-linkage algorithm (optimal) is very close, with values of $0.621$ and $0.624$, respectively. For Figure 2(b) we see that AFHAC-V obtains a better Silhouette Score, that is very close to the optimal vanilla average-linkage HAC score, with values of $0.78$ and $0.8$, respectively. However, FHAC(MFC) and FHAC(Balance) obtain good scores of $0.68$ and $0.36$ as well, indicating satsifactory clustering performance. Finally for Figure 2(c), we see that FHAC(MFC), FHAC(Balance), and AFHAC-V obtain very good clustering performance, close to the optimal vanilla average-linkage HAC Silhouette Score of $0.52$. Thus, we can see that the clustering performance of the FHAC algorithm compares well to vanilla HAC performance, as well as the AFHAC algorithms. Furthermore, the AFHAC-V algorithm performs well in a few cases, but the AFHAC-R generally outputs unfit clusters in terms of performance.

\subsection{Alternate Approach to FHAC}
\looseness-1 We also consider an alternate way of improving fairness for HAC given an output tree from vanilla HAC, $T$. The goal is to come up with a tree $T_{fair}$ that is \textit{fairer} than the tree $T$ with respect to the fairness cost (for the level of $T$ with $k$ clusters, as before). We provide a recursive approach that achieves this with a time complexity of $\mathcal{O}(fn^2)$. The general approach is to temporarily swap clusters between one of the $k$ clusters one at a time, and make a swap permanent only if it improves fairness. By greedily making swaps that reduce the MFC (or balance), the result is a \textit{fairer} tree. However, the algorithm is complex, and its implementation is not trivial. Due to space limitations, we provide this algorithm and present its asymptotic time complexity analysis in the supplementary file (Algorithm A.1). We defer the study of such post-clustering fairness algorithms to future work.

\subsection{Clustering Performance Metrics for Comparing Fair Algorithms}
\looseness-1 In Section 4.4 we compared our proposed algorithm to the AFHAC algorithms and vanilla HAC in terms of clustering performance. For this, we used the Silhouette Score \cite{ROUSSEEUW198753} as the performance metric, which is a general-purpose and commonly used clustering quality metric. While metrics such as the Silhouette Score do give higher scores to convex clusters, they are reliable to get a sense of clustering performance. They are also convenient for comparing fair clusters outputted by different fair clustering algorithms. Other performance metrics such as the Calinski-Harabasz index \cite{chindex} and the Davies-Bouldin index \cite{dbindex} can also be used, but are harder to interpret since they are unbounded. Compared to these, the Silhouette Score always lies between -1 and 1. To the best of our knowledge, other than our paper, only one other related work also considers using the Silhouette Score to compare cluster quality \cite{abraham2019fairness}, and we espouse more papers to undertake similar analysis.

\section{Proof for Proposition 1}
\begin{proposition}
\textit{For appropriately parameterized monotonically increasing functions $\mathcal{Z}_{\alpha}$ and $\mathcal{Z}_{\beta}$, Algorithm 1 computes a $T_{fair}$ that is more (or equivalently) fair to the vanilla HAC tree $T$, according to the chosen fairness cost metric (MFC or balance).}
\end{proposition}

\begin{proof}
Let us first consider choosing the MFC as the cost. Given the fact that $\mathcal{Z}_{\alpha}$ is monotonically increasing and line 11 of Algorithm 1, it is evident that any of the $k$ clusters at the $k$-cluster level of $T_{fair}$ achieves at least $\mathcal{Z}_{\alpha}(0)$-Proportional Fairness. Therefore, Max Fairness Cost for $T_{fair}$ is bounded as:
\begin{align*}
    MFC(T_{fair}) &= \max_{i \in [k]}\sum_{g \in F}|\delta_g^{C_i} - \phi_g|\\
                &\leq  f \mathcal{Z}_{\alpha}(0)
\end{align*}

Furthermore, this bound depends on $\mathcal{Z}_{\alpha}(0)$, which is parameterized such that it reduces the MFC from the original clustering (or ensures it is at least equivalent). Thus, this is the maximum value of MFC that can be attained. However, for the case of vanilla HAC, unless the minimum distance clusters selected for merging also are the most optimal choice for enforcing fairness, the maximum MFC cannot be bounded. Therefore, we have:
\begin{align*}
    MFC(T_{fair}) \leq MFC(T)
\end{align*}

The same idea follows for other fairness metrics, such as \textit{balance}.

\end{proof}

\section{Alternate Post-Clustering Fairness Approach to FHAC}

\begin{algorithm}[H]
\caption*{\textbf{Algorithm A.1}: Proposed FP-HAC Algorithm}
 \textbf{Input:} $T$, $k$, $F$, $D(.,.)$, $\epsilon \in \mathbb{R}$\\
 \textbf{Output:} Fair HAC tree $T_{fair}$
 \begin{algorithmic}[1]

 \State \textbf{set} $l \leftarrow l_k$
 \State \textbf{obtain} $C_{l_k}$ using $l_k$ and $T$
 \State \textbf{set} $C_l \leftarrow C_{l_k}$
 \Statex
 \Function{fix\_tree}{$C_{l}$, $l$, $F$}
 \State \textbf{if} $l > \log_2(n)$ \textbf{then return}

 \For{all $(c_i, c_j) \in C_{l} \times C_{l}$ s.t. $i \neq j$}
    \For{all $(x,y) \in c_i \times c_j$}
        \State \textbf{obtain} $c_i'$ and $c_j'$ by \textbf{swapping} $x$ and $y$ in $C_l'$ (a copy of $C_l$)
        \State \textbf{let} the resulting $M_k'$ clusters of $C_l'$ be $m_i'$ and $m_j'$
        \For{each $g \in F$}
            \State \textbf{if $|\delta_g^{m_i'} - \phi_g| \geq |\delta_g^{m_i} - \phi_g|$ then $P_g^{m_i} = 1$, $P_g^{m_i'} = 0$}
            \State \textbf{else $P_g^{m_i'} = 1$, $P_g^{m_i} = 0$}

            \State \textbf{if $|\delta_g^{m_j'} - \phi_g| \geq |\delta_g^{m_j} - \phi_g|$ then $P_g^{m_j} = 1$, $P_g^{m_j'} = 0$}
            \State \textbf{else $P_g^{m_j'} = 1$, $P_g^{m_j} = 0$}
        \EndFor

        \If{$\sum_{g\in F} P_g^{m_i} \leq \sum_{g\in F} P_g^{m_i'}$ \textbf{and} $\sum_{g\in F} P_g^{m_j} \leq \sum_{g\in F} P_g^{m_j'}$}
            \If{$|\mathcal{D}_{x_S, y} - \mathcal{D}_{x_S, x}| \leq \epsilon$ \textbf{and} $|\mathcal{D}_{y_S, x} - \mathcal{D}_{y_S, y}| \leq \epsilon$}
                \State \textbf{replace} $c_i \leftarrow c_i'$ and $c_j \leftarrow c_j'$
            \EndIf
        \EndIf
    \EndFor
 \EndFor

 \State \textbf{obtain} $C_{l+1}$ by replacing all $x \in c_i$ with $(x_L,x_R)$, $\forall c_i \in C_l$

\State \textproc{fix\_tree}($C_{l+1}, l+1, F$)

 \EndFunction

 \Statex

 \State \textbf{update} $T$ \textbf{using} final $C_{l}$ and \textbf{set} $T_{fair} \leftarrow T$
 \State \textbf{return} $T_{fair}$

 \end{algorithmic}
\end{algorithm}

In this section, we consider an alternate way of achieving fairness while performing HAC. Assume that we already have a tree $T$ using HAC on the dataset $X$. The goal is to then come up with a tree $T_{fair}$ that is \textit{fairer} than the tree $T$ with respect to the fairness cost (for the level of $T$ with $k$ clusters, as before). We propose a recursive algorithm that achieves this with a time complexity of $\mathcal{O}(fn^2)$. For now, we will consider balanced binary HAC trees for our analysis, but our algorithm can be applied to unbalanced trees as well. As a preliminary, in a balanced HAC binary tree $T$ with $n$ leaf nodes, there are $\log_2(n)$ levels, where each level $j$ has $2^j$ nodes where $j \in \{1,..\log_2(n)\}$. Moreover, let the level with $k$ clusters be $l_k$ and the clusters at level $l_k$ be $M_k = \{m_1, m_2, ..., m_k\}$.

Throughout the algorithm, $C_{l}$ denotes a set of $k$ sets, such that each set $c_i \in C_{l}$ represents the clusters at some level $l$ of $T$ that are actually subclusters of $m_i \in M_k$. That is, $c_i$ was merged with some other cluster in the vanilla HAC to eventually become a part of $m_k$ at the level with $k$ clusters. It takes at most linear time to construct $C_{l+1}$ from $C_l$. Moreover, for every $x$ that belongs to the set $c_i \in C_l$, let $x_S$ denote its sibling in the tree, $x_L$ its left child and $x_R$ its right child. In the context of HAC, $x_S$ denotes the cluster $x$ was merged with to form it's parent cluster, and $x_L$ and $x_R$ are the immediate subclusters that were merged to form $x$. Here we also use vectors $P_g^c \in \{0,1\}^f$ to determine if we have met the fairness constraint for group $g \in F$ and cluster $c\in M_k$. Finally, $\epsilon \geq 0$ is a hyperparameter that is used to check for the distance constraint. We also assume that we have the distance matrix $\mathcal{D}$ for each level of the tree, thus looking up between-cluster distances takes constant time. The proposed Algorithm A.1 is denoted as the Fair Post-HAC (FP-HAC) algorithm.

Algorithm A.1 works as follows: we initially start with level $l = l_k$, and set $C_l = C_{l_k}$. Lines 4-25 depict our subroutine \textproc{fix\_tree} that is used to achieve fairness recursively. The base case on line 5 is simple, if we have covered the maximum depth of the tree, we can return. Essentially, we will be swapping nodes/clusters between one of the $k$ clusters one at a time, and see if that improves fairness. By greedily making swaps that reduce the fairness cost, we will have a \textit{fairer} tree as a result. We then select two separate (of the $k$) cluster sets $c_i$ and $c_j$ from $C_l$ and two clusters each ($x$ and $y$) from these cluster sets. We also copy $C_l$, and denote it as $C_l'$. Then we swap the clusters $x$ and $y$ (including all their children) on line 8. We denote the modified clusters of the changed $M_k$ cluster set as $m_i'$ and $m_j'$, respectively (originally $m_i$ and $m_j$). Next, for all groups in $F$, we check to see how many groups the swap improved fairness for as opposed to the original case using the $P_g^c$ vectors. Then, we check to see if fairness was improved for more groups as a result of the swap, than without the swap (line 16). In case fairness was improved, we check for the distance criterion where the distance matrix $\mathcal{D}$ is created during the vanilla HAC process itself. We utilize the hyperparameter $\epsilon$ which is used to set an acceptable threshold to the change in distance as a result of the swap. The sibling of cluster $x(y)$, which is cluster $x_S(y_S)$, is the subcluster that $x(y)$ was chosen to be merged with. Thus, by comparing the increase in distance with the sibling, we can ensure that clusters being swapped are not too "different" and we can finalize the swap process. A large $\epsilon$ allows more swaps at the cost of the distance constraints and a small $\epsilon$ makes it harder to perform swaps. Finally, on line 23, we obtain the set $C_{l+1}$ from $C_l$, simply by replacing each cluster in each set of $C_l$ with it's children/subclusters, $x_L$ and $x_R$. We recursively call \textproc{fix\_tree} on $C_{l+1}$ and $l+1$ and eventually return $T_{fair}$.

\textbf{Note.} The benefit of using Algorithm A.1 to improve fairness of the vanilla HAC tree is that the earlier recursive steps make more \textit{major swaps} between cluster memberships, and progressively \textit{individualized swaps} are made that are computationally more expensive. At a higher level of the tree, a large number of points are swapped collectively, which is less computationally expensive than individually swapping points from each subcluster. Therefore, if at an earlier stage of the recursive algorithm, the fairness constraint for all clusters and their groups is already met, we do not need to recur on the more costly lower levels of the tree. While we have not mentioned this explicitly in Algorithm A.1, this is the precise reason why Algorithm A.1 is beneficial over just making all possible swaps at the last level of the tree itself.

We can now analyze the FP-HAC algorithm's running time and fairness guarantees:

\begin{theorem}
\textit{If a tree $T$ obtained from performing traditional HAC on dataset $X$, is provided as input to Algorithm A.1, it outputs tree $T_{fair}$ in at most $\mathcal{O}(fn^2)$ time such that $T_{fair}$ is equivalent or more fair than $T$ with respect to the chosen fairness cost at level $l_k$.}
\end{theorem}

\begin{proof}
We will complete this proof in two parts. First we prove the fairness guarantees and then the asymptotic time complexity of Algorithm A.1.

In Algorithm A.1, we can easily say that the fairness cost/metric for $T$ and $T_{fair}$ can be equivalent in multiple cases. If $T$ is already as fair as possible, no swaps will go through, and hence $T$ and $T_{fair}$ will be equivalent. Or, $\epsilon$ could be chosen such that $\epsilon \approx 0$, because of which swaps might also not go through, again resulting in $T_{fair}$ and $T$ being equivalent. Thus, in cases such as these, the fairness cost for both $T$ and $T_{fair}$ will be the same.

Now consider that some swaps do go through. Since each swap is made permanent only if it achieves fairness for more groups than achieved prior to the swap (line 18), it has to reduce the Fairness Cost for the clusters $m_i$ and $m_j$ it was made for. Moreover, since $m_i$ and $m_j$ are located at level $l_k$ of $T$ with $k$ clusters, the fairness cost has to reduce with respect to level $l_k$ (lines 11-15). Thus, it is easy to see that (assuming the fairness cost was MFC):
\begin{align*}
    MFC(T_{fair}) \leq MFC(T)
\end{align*}

Now we can move to the proof of the worst-case running time:

At each level $i$ of tree $T$, there are $2^i$ nodes/clusters. Moreover, at level $l_k$, there will be $2^k$ nodes/clusters, and thus, each cluster could be potentially swapped $2^k - 1$ times. We now seek to figure out the total work being done by swapping at any level $i$. At any level $i$, we will still have $2^k * (2^k - 1)$ outer swaps between the $M_k$ clusters since we are not going to swap subclusters within the same cluster. On top of this, there are a maximum of $2^i$ nodes within the same cluster, and a maximum of $2^i$ possible nodes in the other clusters as well. Also, we would do constant constraint checking work for all groups in $F$, that is $|F| = f$ times, for each level $i$. Moreover, apart from this, we do at the most $2^i$ computations to get $C_{l+1}$ from $C_l$ on line 25. Let the work done at level $i$ be denoted as $W_i$. Then we can write:
      \begin{align*}
        W_i \leq (2^k(2^k - 1).2^i.2^i.f) + 2^i
      \end{align*}

      Now, since we go through each level recursively, starting from level $l_k$, we would do the above computations $\log_2(n) - k$ times. Let the total work done by Algorithm A.1 be denoted as $W$. Thus, we can write:
      \begin{align*}
        W &= \sum_{i = 1}^{\log_2(n) - k} W_i\\
        &\leq \sum_{i = 1}^{\log_2(n) - k} 2^k(2^k - 1)4^i.f + 2^i\\
        &\leq \sum_{i = 1}^{\log_2(n) - k} f(2^k(2^k - 1)4^i + 2^i)\\
        &= \frac{f}{3} ((4 - 2^{(2 - k)}) n^2 + 3(2^{(1 - k)}) n - 4^{(k + 1)} + 2^{(k + 2)} - 6)
      \end{align*}

    Thus, the worst-case time complexity for Algorithm A.1 is $\mathcal{O}(n^2f)$.

\end{proof}

        \begin{figure}[H
          \centering
            \scalebox{0.75}{
                \begin{tikzpicture}[level distance=1cm,
            level 1/.style={sibling distance=6.0cm},
            level 2/.style={sibling distance=3.0cm},
            level 3/.style={sibling distance=1.46cm},
            level 4/.style={sibling distance=0.65cm}]
            \node {$c$}
                child {node {$c_1$}
                child {node {$\textcolor{blue}{c_3}$}
                child {node {$c_7$}
                child {node {$\underset{(1)}{n_1}$}}
                child {node {$\underset{(1)}{n_2}$}}
                }
                child {node {$c_8$}
                child {node {$\underset{(1)}{n_3}$}}
                child {node {$\underset{(1)}{n_4}$}}
                }
                }
                child {node {$\textcolor{blue}{c_4}$}
                child {node {$c_9$}
                child {node {$\underset{(2)}{n_5}$}}
                child {node {$\underset{(2)}{n_6}$}}
                }
                child {node {$c_{10}$}
                child {node {$\underset{(2)}{n_7}$}}
                child {node {$\underset{(2)}{n_{8}}$}}
                }
                }
            }
                child {node {$c_2$}
                child {node {$\textcolor{blue}{c_5}$}
                child {node {$c_{11}$}
                child {node {$\underset{(3)}{n_{9}}$}}
                child {node {$\underset{(3)}{n_{10}}$}}
                }
                child {node {$c_{12}$}
                child {node {$\underset{(3)}{n_{11}}$}}
                child {node {$\underset{(3)}{n_{12}}$}}}
                }
                child {node {$\textcolor{blue}{c_6}$}
                child {node {$c_{13}$}
                child {node {$\underset{(4)}{n_{13}}$}}
                child {node {$\underset{(4)}{n_{14}}$}}}
                child {node {$c_{14}$}
                child {node {$\underset{(4)}{n_{15}}$}}
                child {node {$\underset{(4)}{n_{16}}$}}}
                }
            };
        \end{tikzpicture}
        }
        \caption{Initial vanilla HAC tree $T$, $k = 4$, $l = l_k = 2$}

        \end{figure

        %
                \begin{figure}[H
          \centering
                \scalebox{0.75}{
                \begin{tikzpicture}[level distance=1.0cm,
            level 1/.style={sibling distance=6.0cm},
            level 2/.style={sibling distance=3.0cm},
            level 3/.style={sibling distance=1.46cm},
            level 4/.style={sibling distance=0.65cm}]
            \node {$c$}
                child {node {$c_1$}
                child {node {$\textcolor{blue}{c_3}$}
                child {node {$\textcolor{Green}{c_{9}}$}
                child[draw=Green, thick] {node {$\textcolor{Green}{\underset{(2)}{n_{5}}}$}}
                child[draw=Green, thick] {node  {$\textcolor{Green}{\underset{(2)}{n_{6}}}$}}
                }
                child {node {$c_8$}
                child {node {$\underset{(1)}{n_3}$}}
                child {node {$\underset{(1)}{n_4}$}}
                }
                }
                child {node {$\textcolor{blue}{c_4}$}
                child {node {$\textcolor{Green}{c_{7}}$}
                child[draw=Green, thick] {node {$\textcolor{Green}{\underset{(1)}{n_{1}}}$}}
                child[draw=Green, thick] {node  {$\textcolor{Green}{\underset{(1)}{n_{2}}}$}}
                }
                child {node {$c_{10}$}
                child {node {$\underset{(2)}{n_7}$}}
                child {node {$\underset{(2)}{n_{8}}$}}
                }
                }
            }
                child {node {$c_2$}
                child {node {$\textcolor{blue}{c_5}$}
                child {node {$\textcolor{Red}{c_{13}}$}
                child[draw=Red, thick] {node {$\textcolor{Red}{\underset{(4)}{n_{13}}}$}}
                child[draw=Red, thick] {node  {$\textcolor{Red}{\underset{(4)}{n_{14}}}$}}
                }
                child {node {$c_{12}$}
                child {node {$\underset{(3)}{n_{11}}$}}
                child {node {$\underset{(3)}{n_{12}}$}}}
                }
                child {node {$\textcolor{blue}{c_6}$}
                child {node {$\textcolor{Red}{c_{11}}$}
                child[draw=Red, thick] {node {$\textcolor{Red}{\underset{(3)}{n_{9}}}$}}
                child[draw=Red, thick] {node  {$\textcolor{Red}{\underset{(3)}{n_{10}}}$}}
                }
                child {node {$c_{14}$}
                child {node {$\underset{(4)}{n_{15}}$}}
                child {node {$\underset{(4)}{n_{16}}$}}}
                }
            };
        \end{tikzpicture}
        }
        \caption{Intermediate tree: Swapping subclusters at $l=3$

        \end{figure}

        %
                 \begin{figure}[H
          \centering
                \scalebox{0.75}{
                \begin{tikzpicture}[level distance=1.0cm,
            level 1/.style={sibling distance=6.0cm},
            level 2/.style={sibling distance=3.0cm},
            level 3/.style={sibling distance=1.46cm},
            level 4/.style={sibling distance=0.65cm}]
            \node {$c$}
                child {node {$c_1$}
                child {node {$\textcolor{blue}{c_3}$}
                child {node {$c_9$}
                child {node {\textcolor{Red}{$\underset{(4)}{n_{13}}$}}}
                child {node {$\underset{(2)}{n_{6}}$}}
                }
                child {node {$c_8$}
                child {node {\textcolor{Green}{$\underset{(3)}{n_{11}}$}}}
                child {node {$\underset{(1)}{n_4}$}}
                }
                }
                child {node {$\textcolor{blue}{c_4}$}
                child {node {$c_7$}
                child {node {\textcolor{Dandelion}{$\underset{(3)}{n_{9}}$}}}
                child {node {$\underset{(1)}{n_2}$}}
                }
                child {node {$c_{10}$}
                child {node {\textcolor{Mulberry}{$\underset{(4)}{n_{15}}$}}}
                child {node {$\underset{(2)}{n_{8}}$}}
                }
                }
            }
                child {node {$c_2$}
                child {node {$\textcolor{blue}{c_5}$}
                child {node {$c_{13}$}
                child {node {\textcolor{Red}{$\underset{(2)}{n_{5}}$}}}
                child {node {$\underset{(4)}{n_{14}}$}}
                }
                child {node {$c_{12}$}
                child {node {\textcolor{Green}{$\underset{(1)}{n_{3}}$}}}
                child {node {$\underset{(3)}{n_{12}}$}}}
                }
                child {node {$\textcolor{blue}{c_6}$}
                child {node {$c_{11}$}
                child {node {\textcolor{Dandelion}{$\underset{(1)}{n_{1}}$}}}
                child {node {$\underset{(3)}{n_{10}}$}}}
                child {node {$c_{14}$}
                child {node {\textcolor{Mulberry}{$\underset{(2)}{n_{7}}$}}}
                child {node {$\underset{(4)}{n_{16}}$}}}
                }
            };
        \end{tikzpicture}
        }
        \caption{Final tree: Last level ($l=4$) swapping of leaf nodes }

        \end{figure}

\subsection{Toy Example for Algorithm A.1}

Consider $n=16$ and $f=4$, and $\epsilon \leftarrow \infty$. Moreover, $k=4$, so Algorithm A.1 will start recursion at level $l_k = 2$ where we have clusters $c_3, c_4, c_5$, and $c_6$. Therefore, Algorithm A.1 has to ensure that groups in these clusters come as close to meeting the fairness constraint as possible. Also as can be seen in Figure 1: $\phi_1 = \phi_2 = \phi_3 = \phi_4 = 0.25$. Algorithm A.1 first starts on the initial value of $l = l_k = 2$. There is no possible swap that improves fairness at this level, so the algorithm moves on to the next level of the tree. Now $l = 3$, and we have some potential subclusters that can be swapped to improve fairness. It can be seen that the following swaps will be made: $c_7 \Leftrightarrow c_9$, and $c_{11} \Leftrightarrow c_{13}$. The resulting intermediate tree after these swaps are made is shown in Figure 2, and nodes involved in a swap are highlighted with the same color. As a result, the fairness of each of the 4 clusters at $l_k$ has improved. Next, we will recur to $l=4$, where all the singleton clusters (data samples) are present as leaf nodes (Figure 3). Here, the following swaps will be made: $n_5 \Leftrightarrow n_{13}$ (red), $n_3 \Leftrightarrow n_{11}$ (green), $n_1 \Leftrightarrow n_9$ (yellow), and $n_7 \Leftrightarrow n_{15}$ (purple). We can see in Figure 3 that the fairness constraint has been met perfectly ($\delta_g^{c_i} = 0.25$) for all the 4 clusters and all the groups.

\end{document}

redpajama_set_name: RedPajamaArXiv


text:
For movies opening June 9, 2017
June 8, 2017 by Kam Williams
Kam's Kapsules
Weekly Previews That Make Choosing a Film Fun
by Kam Williams
BIG BUDGET FILMS
It Comes at Night (R for profanity, violence and disturbing images) Post-apocalyptic suspense thriller about a couple (Joel Edgerton and Carmen Ejogo) with a son (Kelvin Harrison, Jr.) who successfully evade the deadly plague terrorizing the planet until, against their better judgment, they decide to share their cabin in the woods with a desperate family seeking refuge from the scourge. With Christopher Abbott, Riley Keough and Griffin Robert Faulkner.
Megan Leavey (PG-13 for violence, profanity, mature themes and suggestive material) Kate Mara portrays the title character in this Iraq War docudrama chronicling the real-life exploits of a Marine corporal who successfully conducted over 100 missions with the help of a combat dog until an IED injures them both. Supporting cast includes Common, Edie Falco, Will Patton and Bradley Whitford.
The Mummy (PG-13 for action, violence, partial nudity, scary images and suggestive content) Sofia Boutella assumes the title role in this reboot of the horror franchise revolving around an ancient princess entombed for millennia in a crypt buried deep in the desert who is suddenly revived as a terrifying malevolent force. Co-starring Tom Cruise, Russell Crowe, Courtney B. Vance and Annabelle Wallis.
My Cousin Rachel (PG-13 for sexuality and brief profanity) Adaptation of Daphne du Maurier's classic novel about a revenge-minded Englishman (Sam Claflin) who finds himself falling in love with the cousin (Rachel Weisz) he suspects murdered his guardian (Iain Glen).With Holliday Grainger, Andrew Knott and Poppy Lee Friar.
INDEPENDENT & FOREIGN FILMS
As Good as You (Unrated) Bittersweet dramedy about a grieving lesbian (Laura Heisler) who asks her late wife's brother (Bryan Dechart) to donate the sperm for her artificial insemination, only to subsequently land in a love triangle with her two BFFs (Anna Fitzwater and Raoul Bhaneja). Featuring Annie Potts, Peter Maloney and Karis Campbell.
Beatriz at Dinner (R for profanity and a scene of violence) Salma Hayek portrays the title character in this fish-out-of-water comedy as a Mexican masseuse who is invited to join a wealthy client's (Connie Britton) family for supper when her car won't start following a treatment. With John Lithgow, Chloe Sevigny and Jay Duplass.
Camera Obscura (Unrated) Psychological thriller about a war photographer with PTSD (Christopher Denham) who starts questioning his sanity when he is able to forecast imminent deaths from snapshots he's taken. Featuring Catherine Curtin, Chase Williamson and Nadja Bobyleva and Noah Segan.
The Hero (R for drug use, profanity and sexuality) Sam Elliott stars as the title character in this bittersweet portrait of an aging star of Westerns who finds himself facing his mortality after being diagnosed with cancer. Supporting cast includes Nick Offerman, Katharine Ross and Laura Prepon.
The Hunter's Prayer (R for violence, profanity and drug use) Cat-and-mouse thriller about an assassin (Sam Worthington) who ends up on the run with a woman (Odeya Rush) he decides not to kill. With Martin Compston, Tina Maskell and Eben Young. (In English, German and French with subtitles)
I Love You Both (Unrated) Sibling rivalry dramedy about a twin brother (Doug Archibald) and sister (Krystin Archibald) whose tight bond becomes strained when they start dating the same guy (Lucas Neff). Featuring Artemis Pebdani, Angela Trimbur and Kate Berlant.
Night School (Unrated) Against-the-odds documentary chronicling the efforts of three students to graduate from one of Indianapolis' worst, inner-city high schools.
Raising Bertie (Unrated) Coming-of-age documentary chronicling a half-dozen years in the lives of a trio of ambitious, African-American adolescents being raised in rural North Carolina.
Source: Baret News
Filed Under: Entertainment Tagged With: BIG BUDGET FILMS, Carmen Ejogo, Independent & Foreign Films, Joel Edgerton, Megan Leavey, The Mummy

redpajama_set_name: RedPajamaCommonCrawl


text:
Q: get information from struct in swift file so i have a class swift file that has a UserAccount class like this
class UserAccount{

 var userName: String!
 var email: String!
 var instaGram: String!
 var timeCreated: String!
 var like: String!
 var role: String!
 var active: String!
 var id: String!

init(userName: String, email: String, instaGram: String, timeCreated: String, like: String, role: String, active: String, id: String){

    self.userName = userName
    self.email = email
    self.instaGram  = instaGram
    self.timeCreated = timeCreated
    self.like = like
    self.role = role
    self.active = active
    self.id = id

 }

}
i have login view controller where i get the class variables and do my json and assign their values like this :
var userAcount = [UserAccount]() // Array Of Object
var user = UserAccount(userName: "", email: "", instaGram: "", timeCreated: "", like: "", role: "", active: "", id: "") //Init of Object

This is where i get my Json and add its value to its corresponding user class varible, i do this on my login view controller:
self.user.userName = userData.value(forKey: "userName") as! String
self.user.email = userData.value(forKey: "email") as! String
self.user.instaGram = userData.value(forKey: "instaGram") as! String
self.user.timeCreated = userData.value(forKey: "timeCreated") as! String
self.user.role = userData.value(forKey: "role") as! String
self.user.like = userData.value(forKey: "likes") as! String
self.user.id = userData.value(forKey: "id") as! String
self.user.active = userData.value(forKey: "active") as! String

this is where i append the information to my class array:
self.userAcount.append(self.user)

now my problem is that i dont know how to display the information in the UserAccount class on other view controllers, example the user profile view controller, is my first time working with users and profile, any help would be appreciated it, thank you

A: To provide data to another UIViewController

*

*Using Storyboard or segue
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
   if segue.identifier == "your_identifier",
      let destinationVC = segue.destination as? YourViewController {
        destinationVC.userAcount = self.userAcount
    }
}

*Programmatically
func gotoNextVC() {
    let destinationVC = YourViewController(nibName: "YourViewController", bundle: nil)
    destinationVC.userAcount = self.userAcount
    self.navigationController?.pushViewController(destinationVC, animated: true)

    // OR
    self.present(destinationVC, animated: true, completion: nil)
}

A: In another ViewController make a Instance of your UserAccount.
When you wake that new view controller, pass value of UserAccount, to pass value you have two option
1. Storyborad/Segue
func prepare(for segue: UIStoryboardSegue, sender: Any?){
      if segue.identifier == "identifier"{
        let destinationVC = segue.destination as? YourViewController
        destinationVC.userAcount = self.userAcount
      }
   }

2. By code
let storyBoard = UIStoryboard(name: "Main", bundle: Bundle.main)
   let controller = storyBoard.instantiateViewController(withIdentifier:      identifier)
   controller.user = self.user

and now to access in your NewViewController you can simply access by
let userName = self.user.userName

redpajama_set_name: RedPajamaStackExchange


I feel like I've been picking out books for peculiar reasons this year. This one was another attempt to figure out whose voice I hear the most in My Lady Jane by Cynthia Hand, Jodi Meadows, and Brodi Ashton. No. I do not have a problem. How dare you judge me.
Lex is a math genius, a high school senior who has worked very hard to get into MIT. She's a sister, a daughter, and a girlfriend. She has friends she loves and a bright future in front of her. And her brother is dead. The future that was so bright seems lonely and unsure. Everything changed in one moment, with one text. Everything. And it haunts Lex. He haunts Lex.
I had absolutely no expectations with this book. To be honest, it's one I would normally shy away from - the loss of a sibling plot line overwhelms our shelves at the library, and it's not really one of my favorite types of stories. But without anything waiting in my audiobook queue, and my little experiment still on my mind, I thought I'd give it a chance.
And I loved this book. It was thoughtful, sincere, and genuine in its depiction of loss and regret. There was no aptly timed romance to pull Lex out of her depression, no overly preachy therapist bashing ideas into her head. There is a girl who is sad And there wasn't someone telling her she shouldn't be. Lex was a fully developed character, and through her you get a full picture of Tyler. Her healing takes time and patience, but it pays off with a gradual understanding and appreciation for a life, both her own and her brother's.
In case you're wondering, Hand's voice was very familiar. References to pop culture (including The Princess Bride) and a dry wit reminded me a lot of My Lady Jane. I'll definitely be checking out her other series. But first I need to give Jodi Meadows a shot.
I didn't dissolve in a pool of tears with this one, but I did appreciate Lex's journey and her tenacity.


THE SURGE NETWORK – THE POWER OF TECHNOLOGY STARTS HERE!
THE POWER OF TECHNOLOGY STARTS HERE!
We will fight your corner by creating petitions on behalf of those who share similar opinions as we do. By doing so, the large body of supporters can help take action towards the cause.
We provide a fun and engaging livestream via our Twitch channel, plus pre-recorded crystal clear, high definition content to our YouTube channel.
An un-biased breakdown of the pros, cons, final verdict and alternative options to the latest software/hardware technologies that you may be considering to buy in the near future.
We share high-quality video and text-based tutorials detailing the latest software and hardware. This includes gaming, Android, Windows, Linux and consumer technology.
We offer the chance for gamers to send us their gameplay where we showcase those pure skill and those damn right stupidly, funny epic fail moments into monthly compilation uploaded to our YouTube channel.


text:
< Previous | ALAN RUSSELL
JERRY SANDERS | Next >
THE ORIGINAL WHISTLEBLOWER
Can one individual really make a difference in tackling injustice, propaganda, corruption, war?
Two words are all you need in answer: John Pilger.
In a New Statesman survey of the 50 Heroes of Our Time, Pilger came fourth, in the company of legends like Aung San Suu Kyi and Nelson Mandela.
Pilger has been called Australia's compensation for Murdoch, and while it's easy to laugh at the scathing comment on the latter, it doesn't begin to touch on the incredible contributions of the former.
He's the investigative journalist and war correspondent who has shaped the conscience of a generation. A documentary filmmaker whose commitment to unearthing the truth – as filthy, dangerous and brutal as it may be – is unshakeable. When history puts the current period under a hard lens it may well conclude that Pilger alone served to bring some kind of balance to the search for justice in an otherwise corrupt age.
That he's anti-establishment is no surprise; what is, however, is his implacable courage in the face of conflict. He has called the United States "the world's leading rogue state" and Israel "the American watchdog in the Middle East." He hasn't spared his native Australia either, taking on its leaders for their inhuman immigrant detention programmes and appalling treatment of the aborigines.
His battles are at once local and global: the fight for one indigenous peoples is, after all, a fight for them all. If there's an underlying theme to his perspective, it's a war on injustice: Pilger painstakingly reveals hidden agendas and the injustices that are inherent to the politics of the high and mighty.
His message isn't pretty – and neither is his medium. Whether through pictures, words, or his award-winning documentaries, Pilger has mastered the art of weaving an honest, compelling narrative that moves you to feel the suffering and injustice he battles, and the apathy of the "invisible governments".
Perhaps his greatest asset, though, is his ability to deconstruct the intricate and often hidden propaganda machinery behind governments, corporations and even media: from vested interests to 'embedded journalists' perpetuating untruths about a war, to centuries old exploitation of the original inhabitants of a land, Pilger is a myth-buster who reveals the deft techniques used by those in power. Small wonder, then, that Noam Chomsky calls him 'a beacon of light in often dark times'.
He has reported from the frontlines of every major war in the last few decades –Vietnam, Cambodia and Iraq, among others – and is, arguably, the original whistleblower; the voice that probes chinks in the establishment version of encounters and death tolls, and openly questions the motivations behind international interventions. Mainstream media is as much in his line of fire as the political establishment: he has, in the past, called such journalists and media "channelers and echoers of what Orwell called official truth."
Hailing from a political family, Pilger's journalistic leanings were evident right from school: he founded a student paper, The Messenger, then later went on to work with the Sydney Sun and the Daily Telegraph. Later, having moved to London, he worked with the British United Press and Reuters before moving to the Daily Mirror.
In 1969 – a few years into his journalistic career – he made his first documentary on the Vietnam war for World in Action, a TV show on Granada Television. It was the first of over 50 documentaries he would go on to make – and was widely recognised as a scoop of sorts, being the first piece of reporting to document the failing morale of American soldiers in Vietnam.
In the decades since, his skills have sharpened, his voice strengthened, his vision honed – but his desire for justice remains as vivid as it was the day he entered the profession. He's won two British Journalist of the Year awards, several honorary degrees, a BAFTA for factual reporting and, in 2009, the Sydney Peace Prize 'for work as an author, film-maker and journalist as well as for courage as a foreign and war correspondent in enabling the voices of the powerless to be heard. For commitment to peace with justice by exposing and holding governments to account for human rights abuses and for fearless challenges to censorship in any form.'
John Simpson, the BBC's world affairs editor put it more succinctly when he said "a country that does not have a John Pilger in its journalism is a very feeble place indeed."
< Previous | ALAN RUSSELL /


AtriCure (NSDQ:ATRC) said today that it launched a new FDA investigational device exemption cleared trial of its CryoIce system exploring its use in treating persistent atrial fibrillation during concomitant open-chested cardiac surgery.
The first patient in the trial has already been treated, the Mason, Ohio-based company said. The initial procedure took place at Takoma Park, Md.'s Washington Adventist Hospital.
"Cryothermal energy has been a mainstay of surgical ablation for a long time. The ICE-AFIB IDE trial is the first of its kind designed to assess the safety and sustained effectiveness of cryothermal ablation as a standalone energy source for surgical AF ablation," national principal investigator Dr. Niv Ad of the Washington Adventist Hospital said in a press release.
The ICE-AFIB study aims to enroll 150 patients with persistent or long-standing persistent AF who are undergoing cardiac surgical procedures for heart valve repair or replacement or coronary artery bypass procedures, AtriCure said.
The company's CryoIce system, along with the AtriClip left atrial appendage occlusion device, will be used to perform the Cox-Maze III lesion set in the trial. Primary effectiveness endpoints are defined as freedom from AF, atrial flutter and/or atrial tachycardia lasting more than 30 seconds.
Patients in the trial will be evaluated at 12 months and monitored out to three years, Atricure said.
"While AtriCure's ABLATE clinical trial confirmed that the usage of the Isolator Synergy ablation system (radiofrequency ablation (heat)) when supplemented with select lesions created with cryothermal energy is an effective treatment for persistent and long-standing persistent Afib during cardiac surgery, the ICE-AFIB trial is a unique opportunity to generate systematic clinical evidence on the safety and effectiveness of cryosurgery for the treatment of such patients. The ICE-AFIB trial is yet another testament to AtriCure's commitment to and leadership in improving the lives of atrial fibrillation patients undergoing cardiac surgery," prez & CEO Michael Carrel said in a prepared statement.
Last month, AtriCure shares took a fall despite preliminary results for the fourth quarter and 2018 that topped estimates.
Filed Under: Cardiovascular, Clinical Trials, Surgical Tagged With: AtriCure Inc.


text:
Bonnie Gilbert
Bonnie Gilbert, age 63, of Packwood, Iowa, formerly of Mt. Pleasant, Iowa, died Thursday, April 9, 2020, at the Jefferson County Hospital following a sudden illness. Due to state and federal guidance on gatherings due to the Covid-19 pandemic, the family will not be having a public memorial at this time. Private family services will be held 1:30 p.m. Tuesday, April 14th at the Jones & Eden Funeral Home with Pastor Paul Miller officiating. Services will be livestreamed on the Jones & Eden Facebook page. Private family calling hours will be held from 1:00 p.m. until 5:00 p.m. Monday, April 13th. Interment will take place at the Hillsboro Cemetery in Hillsboro, Iowa. A general memorial has been established. Online condolences may be sent for Bonnie's family through the web at www.jonesfh.com Bonnie was born March 20, 1957, in Des Moines, Iowa, the daughter of Delbert "Dick" and Ruth (Long) Goodwin. She attended school in Washington, Iowa. Bonnie was married to Danny Gilbert on November 4, 1998. Bonnie lived in Mt. Pleasant for the past 12 years before moving to Packwood in December of 2019. She was a homemaker and enjoyed puzzles, word searches, coloring and collecting owl memorabilia. She is survived by her husband, Danny Gilbert of Packwood, Iowa; daughter, Sherry Goodwin of Ottumwa, Iowa; son, Ronnie Wixom and wife Wendi of Bonaparte, Iowa; son Edward Wixom of Mt. Pleasant, Iowa; eight grandchildren and six great grandchildren. She is also survived by sister, Charlotte Semler and husband Ron of Washington, Iowa; sister, Diane Majors of Concordia, Missouri; brother, Ron Goodwin and wife Arlene of East Pleasant Plain, Iowa; brother, Fred Goodwin of Newton, Iowa; half brother, David Goodwin of Washington, Iowa; and half brother, Don Goodwin of Ainsworth, Iowa. Bonnie was preceded in death by her parents; first husband, Richard Wixom; daughter, Mary Wixom; brother, Daryle Goodwin; and two sisters, Sharyle Denison and Sharon Latham.
Bonnie Gilbert, age 63, of Packwood, Iowa, formerly of Mt. Pleasant, Iowa, died Thursday, April 9, 2020, at the Jefferson County Hospital following a sudden illness. Due to state and federal guidance on gatherings due to the Covid-19 pandemic,... View Obituary & Service Information
The family of Bonnie Gilbert created this Life Tributes page to make it easy to share your memories.
Bonnie Gilbert, age 63, of Packwood, Iowa, formerly of Mt. Pleasant,...
Send flowers to the Gilbert family.


text:
Game Reviews June 26, 2014
Review: Wolfenstein: The New Order | Xbox One
Review: Among The Sleep | Steam
The Bug Report | Retail Announcement Slip Ups
Set in both the 1940's and 1960's Wolfenstein: The New Order is the story of an alternate future where the Nazi's won the second world war and ultimately conquered the world. You play William "BJ" Blazkowicz as he fights to bring down the psychopathic General Deathshead, a maniacal scientist who turned the tide of war through stolen futuristic technology and seeks to bring the world to its knees.
At first I was confused when playing this game as BJ was a meathead, who had spent his previous games gunning down nazi's with over the top guns. The New Order felt so serious, but as I played through I was exposed to all the subtle nuances and then it all clicked.
Machine Games have done a fantastic job of mirroring the story of Wolfenstein the game, into the story of Wolfenstein: The New Order. Both William "BJ" Blazkowicz, and the Wolfenstein "game" are out of time. The protagonist is a blunt instrument whos sole purpose is to gun down Nazi's. More modern first person shooters (FPS) games require main characters to have a back story, motivation, and emotional baggage. BJ however is a relic of a different time in both gaming and in his story. One minute he is in the trenches of 1940 and the next minute the world has grown up around him as he sits like a vegetable with shrapnel lodged in his brain, leaving him behind. It's done cleverly and subtly and never draws attention to the fact. For this I applaud you machine games.
The two worlds of first person shooters have been merged together beautifully and many of the distinct features of the original have been retained. BJ can carry all of his weapons at once which might seem unrealistic compared to modern shooters but adds an extra depth to the game as you can change your tactics for different firefights. You can decide whether or not to take then out quietly with a knife or silenced pistol, steadily moe them down from cover using an assault rifle or go in all guns blazing with dual wield automatic shotguns.
The levels look and play beautifully with a selection of close combat corridors, to larger arena style battles. Each level is different to the last as BJ is taken from concentration camp to a moon base and despite the overall dreary colour palette, you can forgive them due to the nature of game. Machine games have done a sterling job of conveying a crushed world, which is most poignantly seen when the player gazes over the London skyline. The view of buildings littered with swastikas, newly added oppressive structures and the ever watching robotic eye of the London Monitor really support the feeling of desperation.
Killing Nazi's is still fun and made easier by the fact they are now mainly faceless armoured soldiers, mechanically augmented soldiers and brain controlled mechs who have literally had their morals and compassion removed by the evil villain, General Deathshead. Any worry that you might be shooting the innocent who are simply following orders is wiped out when the soldiers shoot bed ridden mental patients in front of you, bomb innocent people and slice and dice anyone who stands in their way. Even during a brief meeting on train where the evil Frau Engel quizzes you, they ooze evil making bringing on their demise so much more satisfying.
Both the stealth mechanic and cover mechanics are simple but well implemented. Each level can be tackled differently depending on your play style and the player is rewarded with 'perks' accordingly. The perks may only reward you with extra ammo capacity or increase health, but the very fact it exists encourages the player to try playing levels differently to unlock the myriad of achievements.
The commander mechanic is also a nice touch as these high ranking officials have the ability to call in more troops meaning players will want to take these out quickly and if possible, quietly.
It weird to think of a character like BJ actually having a love interest but his story works well and even the sex scene is tastefully done. Supporting characters are well acted and their very 'broken' nature fit so nicely with the fact that BJ is a relic himself. The rag-tag team of a crippled soldier, a mentally unstable strategist, a mentally disabled 'man-boy', an emotionally broken ex-nazi and a Scottish soldier with a grunge against you for saving him. The various parts work together to create a wonderful whole.
I can't praise Machine Games enough for handling what really is a difficult game and concept so well. I think this title is going to be Mis-understood by many and criticised for not fitting into the modern day FPS mould but over time this will be appreciated by more and more.
Despite all of its features, it does have a few niggles which that detract from the experience. The enemy Ai is not always great and some of the later levels are actually easier then some of the early ones. My main gripe was the home base levels which consisted of a number of fetch-quests designed to pad out the game time so thy can boast a 20 hour game experience. These levels are ok for introducing supporting characters and for helping the player connect with then but I didn't enjoy delivering notes and collecting drills just to increase the game time. The lack of a multiplayer does reduce the replayability but the split path narrative and slew of collectables to get should keep most bargain hunters busy.
I came into this game thinking I was getting a Duke Nukem style shooter but left feeling like I had played a well thought out and considered homage to not only the Wolfenstein franchise but also to the original FPS games of the 90's. This has to be one of my top three games of the generation so far and whilst it has its issues I found it refreshing to be back playing a single player focused shooter. I would definitely recommend it.
Did you find the classic Wolfenstein 3D game hidden within The New Order?
Wolfenstein: The New Order | Xbox One
Related ItemsBlazkowiczDuke NukemFirst-person shootergamegame reviewsgames reviewsLondonNazismReviewsWolfensteinWorld War II


text:
Teodot d'Ancira (Theodotus, ) fou un teòleg, bisbe d'Ancira (la moderna Ankara) a Galàcia al . És venerat com a sant per diverses confessions cristianes.

Va estar present al primer concili d'Efes el 431 i va donar suport a Ciril d'Alexandria en contra de Nestori, tot i que abans havia donat suport a aquest. Al seu torn, Teòdot fou condemnat pels nestorians al Sínode de Tars de 432.

Fou autor de nombroses homilies i obres de controvèrsia religiosa, entre els quals uns comentaris al Credo de Nicea, on sosté que la doctrina nestoriana ja havia estat condemnada al primer Concili de Nicea de 325. Els sermons sobre les festes de Nadal i de la Candelera són proves que se celebraven ja en aquell moment. Fabricius dona la llista completa d'obres; algunes foren publicades a les actes dels concilis i es conserven en biblioteques, però d'altre s'han perdut.

Notes

Bisbes romans d'Orient
Sants de Galàcia
Sants de l'anglicanisme
Sants de l'Església Catòlica
Sants de l'Església Ortodoxa
Persones d'Ankara
Romans d'Orient del segle V
Sants romans d'Orient
Religiosos turcs

redpajama_set_name: RedPajamaWikipedia


Wondering if how powerful is Apple's newest Mac Pro? Is it just an overpriced toy, a trash can, or an expensive air blower?
Here is a 2013 Mac Pro attached with four displays and a ton of Thunderbolt RAID units and external drives.
Image by Roman Loyola @pinatubo2000, a writer for Macworld.
This entry was posted on Thursday, April 10th, 2014 at 7:36 pm	and is filed under Mac. You can follow any responses to this entry through the RSS 2.0 feed.


text:
The Art Newspaper Podcasts
The Week in Art
From breaking news and insider insights to exhibitions and events around the world, the team at The Art Newspaper picks apart the art world's big stories with the help of special guests. An award-winning podcast hosted by Ben Luke, The Week in Art is sponsored by Christie's. See acast.com/privacy for privacy and opt-out information.
Courageous reporting
"Maybe surprisingly for an art newspaper but I learn so much about world events from this podcast, for example the horrors happening to the Ouïgours which is barely mentioned in the mainstream newspapers. Thank you"
stilllearningtoo via Apple Podcasts · Great Britain · 10/11/21
"I love this podcast"
YoungSoph via Apple Podcasts · Great Britain · 08/30/21
Look forward to every episode...
"Thank you to everyone at The Week in Art and The Art Newspaper for this amazing podcast. The topics are fascinating and the interviews are sufficient length that one learns a great deal from each guest. A specific shout-out to the producer or editor who came up with the idea of inserting a..."Read full review »
YYZLHRFCO via Apple Podcasts · Australia · 05/22/21
The art world in 2022: big shows and market predictions
In this first episode of 2022, The Art Newspaper's contemporary art correspondent Louisa Buck and the novelist and columnist at The Art Newspaper Chibundu Onuzo preview the year's biennials, exhibitions and art fairs and our editor-at-large Georgina Adam has a stab at predicting the art market's...
2021's biggest art world stories—and what they mean
It's the final episode of 2021 and so, as always, it's our review of the year. Joining Ben Luke to look at 2021's biggest stories are three members of The Art Newspaper team: Martin Bailey, a correspondent in London, Anna Brady, art market editor, and Jane Morris, editor-at-large. See...
theartnewspaper.com


text:
Murray, Cantwell: Women's health cuts won't pass
With a federal government shutdown looming, nine women Senators said Friday they will not sacrifice women's health care services as the price of a budget deal with Republicans in the U.S. House of Representatives.
"We know we have to keep the government open," said Sen. Patty Murray, D-Wash., but she added: "We are not going to throw women under the bus to give them an agreement to keep this government open."
House Republicans, in their budget plan for the remainder of the fiscal year, axed $317 million for a program known as Title X, a women's health initiative enacted 40 years ago under Republican President Richard Nixon.
The House also added a "rider" directing that Planned Parenthood not receive any federal money from any source. Planned Parenthood gets a quarter of Title X money, none of which is used to pay for abortions.
Republicans "won't budge until their social agenda is jammed through Congress," Sen. Maria Cantwell, D-Wash., told the news conference. "This is not a budget impasse on fiscal issues."
Murray and Cantwell have spent a contentious week on Capitol Hill. On Wednesday, they helped beat back efforts to block the Environmental Protection Agency from regulating and limiting greenhouse gases.
The budget battle Friday has revolved around House "riders" restricting environmental enforcement and de-funding women's health. The environment issue apparently has been resolved, but Planned Parenthood has made for a major impasse.
The tall (Sen. Dianne Feinstein, D-Calif.) and short (Murray and Sen. Barbara Miluksi, D-Maryland) of the Senate's Democratic women were breathing fire Friday.
"Radical ideological riders" are holding the operation of government hostage, said Mikulski. Feinstein added: "The numbers have been agreed to, but it's an opportunity for the right wing in the House to really sock it to women."
Rep. Chris Smith, R-New Jersey, leader of the pro-life caucus in the House, on Friday described Planned Parenthood clinics as "abortion mills-period."
Planned Parenthood has countered that Title X money is used for preventive care with such services as breast cancer screenings, Pap tests and family planning counseling, and basic health care for low-income women.
"Not a single dime can be used for abortions," said Sen. Barbara Boxer, D-Calif.
Supporters of Planned Parenthood in Washington have presented Murray and Cantwell with more than 45,000 voter signatures urging them to resist the House riders.


November 2009 – Alumnae Panhellenic of Tallahassee, Inc.
Sign up to donate an item for our annual Thanksgiving Philanthropy Project. We will be collecting donations on Monday, November 23 from 5:30 – 6:30 PM. Meet in the parking lot of the Lake Ella Publix (1700 North Monroe). Look for Dalisha's silver XTerra.
We will also accept donations of Publix Gift Cards in any denomination, to fill in the lists where needed. Just drop them off on Monday, November 23.


Nest 50$ Off Promo Codes in April 2019 are updated and verified. Today's top Nest 50$ Off Promo Code: $50 Away from Once You Acquire Property Hub And Select Nest Merchandise.
Details: Get $50 Off when you buy two Nest Cam outdoor 2-pack.
Get $50 off when you buy two Nest Cam Outdoor security camera.
Get $50 Off when you buy Outdoor two pack Security Camera.
A nest is a structure built by certain animals to hold eggs, offspring, and, occasionally, the animal itself.
Nest Cam, the all-new Nest Protect, & the Nest Learning Thermostat.


text:
Q: Ruby C API - how to remove class methods (specifically, new)? I'm writing a Ruby binding to a C library. I want to remove the new method from some of my classes  - I'm creating objects with other class methods like create and load and the default implementation of new just leaves me with an invalid pointer (the objects of the class are just pointers to opaque structs).
I've read this but
class Test
end

class <<Test
   remove_method :new
end

Just gave me

NameError: method `new' not defined in Class

And anyways I want to do it from C (and avoid rb_eval_string).

A: The new method does 3 things:

*

*It calls allocate

*It calls initialize

*It returns the new object (and ignores the return value of initialize).

I don't think you can succesfully remove it. However making new private is fine:
class X

  def initialize(a,b)
    @a=a
    @b=b
  end

  private_class_method :new

  def X.create(x,y)
    new(x,y)
  end

end