# The Causal Chambers:
Real Physical Systems as a Testbed for AI Methodology

Juan L. Gamella111Correspondence to Juan L. Gamella
<EMAIL_ADDRESS>Seminar for Statistics
ETH Zürich  Jonas Peters  Seminar for Statistics
ETH Zürich  Peter Bühlmann  Seminar for Statistics
ETH Zürich

###### Abstract

In some fields of AI, machine learning and statistics, the validation of new
methods and algorithms is often hindered by the scarcity of suitable real-
world datasets. Researchers must often turn to simulated data, which yields
limited information about the applicability of the proposed methods to real
problems. As a step forward, we have constructed two devices that allow us to
quickly and inexpensively produce large datasets from non-trivial but well-
understood physical systems. The devices, which we call _causal chambers_ ,
are computer-controlled laboratories that allow us to manipulate and measure
an array of variables from these physical systems, providing a rich testbed
for algorithms from a variety of fields. We illustrate potential applications
through a series of case studies in fields such as causal discovery, out-of-
distribution generalization, change point detection, independent component
analysis, and symbolic regression. For applications to causal inference, the
chambers allow us to carefully perform interventions. We also provide and
empirically validate a causal model of each chamber, which can be used as
ground truth for different tasks. All hardware and software is made open
source, and the datasets are publicly available at causalchamber.org or
through the Python package causalchamber.

###  1 Introduction

Methodological research in AI, machine learning, and statistics often develops
without a concrete application in mind. Many impactful advances in these
fields have been made in this way, and there are important theoretical
questions that are studied outside the context of a particular application.
Crucially, progress also relies on having access to high-quality, real-world
datasets, which benefits methodological and theoretical researchers by helping
them steer research in meaningful directions, relaxing assumptions that are
unlikely to hold in practice, and developing methodologies that may work well
on a variety of real-world problems.

However, for some research areas, particularly nascent ones, it can be
difficult to find real-world datasets that provide a ground truth suitable to
validate new methods and check foundational assumptions that underlie
theoretical work. This is because new fields come with new requirements in
terms of ground truth, and few or no datasets may have been collected that
already satisfy them. For example, for most sub-fields of causal inference [1,
2, 3], we require data from phenomena whose underlying causal relationships
are already exquisitely understood, or for which carefully designed
intervention experiments are available. For symbolic regression [4, 5], the
data must follow a known, closed-form mathematical expression, e.g., a natural
law in a controlled experimental environment. For the different types of
representation learning [6, 7], we may need data for which there are some
latent “generating factors” that we can measure directly. Such datasets can be
difficult to obtain in practice, and few exist for these tasks. As a result,
researchers are often limited to synthetic data produced by computer
simulations, which may fall short of answering how well a particular method
works in practice.

This is where we believe our work can contribute. We have constructed two
physical devices that allow the inexpensive and automated collection of data
from two well-understood physical systems. The devices, which we call _causal
chambers_ , consist of a light tunnel and a wind tunnel (Fig. 2). They are, in
essence, computer-controlled laboratories (Fig. 1) to manipulate and measure
different variables of the physical system they contain.

We believe that the chambers are well-suited to substantially improve the
validation of methodological advancements across machine learning and
statistics, by providing real datasets with a ground truth for fields where
such datasets are otherwise scarce or non-existent. This is accomplished
through two key properties of the chambers. First, the underlying physical
systems are well-understood, in the sense that relationships between most
variables are described by first principles and natural laws involving linear,
non-linear, and differential equations—see App. III and IV for a detailed
description with carefully designed experiments. This allows us to provide
ground truths for a variety of tasks, including a causal model of each
chamber. Second, we can manipulate the systems in a controlled and automated
way, quickly producing vast amounts of data. Furthermore, the chambers produce
data of different modalities, including i.i.d., time-series, and image data,
allowing us to provide validation tasks for a wide range of methodologies.

To illustrate the practical use of the chambers, we perform case studies in
causal discovery, out-of-distribution generalization, change point detection,
independent component analysis and symbolic regression—see Sec. 4 and Fig. 5
and 6. Our choice constitutes only an initial selection, and we believe many
other possibilities exist.

Our work complements existing datasets from more complex real-world systems
for which a ground truth is not or only partially available [[, e.g.,
]]koh2021wilds, as well as efforts to produce synthetic data that mimics such
systems [[, e.g.,
]]gamella2020active,göbler2024textttcausalassembly,cheng2023causaltime,cava2021contemporary,udrescu2020ai,greenfield2010dream4.
While the good performance on the chambers is not guaranteed to carry over to
more complex systems, we believe that the chambers can serve as a sanity check
for foundational assumptions and algorithms that are intended to work in a
variety of settings.

A list of all datasets we currently provide can be found at causalchamber.org,
together with a description of the experimental procedures used to collect
them. To allow other researchers to build their own chambers, we provide
blueprints, component lists, and source code in the repository
github.com/juangamella/causal-chamber-paper.

###  2 The Causal Chambers

Figure 1: Data collection workflow. The user provides an _experiment protocol_
consisting of step-by-step instructions describing the data collection
procedure, which the chamber then carries out without human supervision. The
instructions specify when and to which values the actuators and sensor
parameters should be set. They also specify when measurements of all variables
should be taken and at which frequency, at a maximum of 10 Hz for the light
tunnel and 7 Hz for the wind tunnel. Actuators and sensor parameters can also
be set automatically by the chamber as a function of other variables in the
system, such as sensor measurements. This allows introducing additional
complexity for some validation tasks, as described in Sec. 3.

Each chamber is a machine that contains a simple physical system and allows us
to measure and manipulate some of its variables. The chambers contain a
variety of _sensors_ , for example, to measure light intensity or barometric
pressure. To manipulate the physical system, _actuators_ allow us to control,
for example, the brightness of a light source or the speed at which fans turn.
Each sensor can also be manipulated by modifying some of its parameters, such
as the oversampling rate or reference voltage.

Throughout this manuscript, we refer to the actuators and sensor parameters as
the _manipulable variables_ of the chamber. A programmable onboard computer
controls all sensor parameters and actuators, enabling the chambers to conduct
experiments and collect data without human supervision (Fig. 1). As a result,
the chambers can quickly produce vast amounts of data, up to millions of
observations or tens of thousands of images per day.

In the remainder of this section, we give an overview of each chamber, its
physical system, and some of the measured variables. Fig. 2 provides diagrams
of the chambers and their main components, and a detailed description of all
variables can be found in App. II.

####  2.1 The Wind Tunnel

The wind tunnel (Fig. 2ac) is a chamber with two controllable fans that push
air through it and barometers that measure air pressure at different
locations. A hatch at the back of the chamber controls an additional opening
to the outside. A microphone measures the noise level of the fans, and a
speaker allows for an independent effect on its reading.

The tunnel provides data from 32 numerical and categorical variables (see Fig.
4a for some examples), of which 11 are sensor measurements, and 21 correspond
to actuators and sensor parameters that can be manipulated. For example, we
can control the load of the two fans ($L_{\text{in}},L_{\text{out}}$) and
measure their speed
($\tilde{\omega}_{\text{in}},\tilde{\omega}_{\text{out}}$), the current they
draw ($\tilde{C}_{\text{in}},\tilde{C}_{\text{out}}$), and the resulting air
pressure inside the chamber ($\tilde{P}_{\text{dw}},\tilde{P}_{\text{up}}$) or
at its intake ($\tilde{P}_{\text{int}}$). We can manipulate sensor parameters
like the oversampling rate of the barometers
($O_{\text{dw}},O_{\text{up}},O_{\text{int}}$) or the timer resolution of the
speed sensors ($T_{\text{in}},T_{\text{out}}$), further affecting their
measurements. In the circuit that drives the speaker, we can manipulate the
potentiometers ($A_{1},A_{2}$) that control the amplification, monitoring the
resulting signal at different points of the circuit
($\tilde{S}_{1},\tilde{S}_{2}$) and through the microphone output
($\tilde{M}$).

####  2.2 The Light Tunnel

The light tunnel (Fig. 2bd) is a chamber with a controllable light source at
one end and two linear polarizers mounted on rotating frames. The relative
angle between the polarizers dictates how much light passes through them (see
Fig. 4c and Fig. 4e) and sensors measure the light intensity before, between,
and after the polarizers. A camera on the side opposite the light source
allows taking images from inside the tunnel.

The tunnel provides image data (Fig. 4e) and 41 numerical and categorical
variables (e.g., Fig. 4bcd), of which 32 can be manipulated. For example, we
can control the intensity of the light source at three different wavelengths
($R,G$ and $B$) and measure the drawn electric current ($\tilde{C}$). Using
motors, we can rotate the polarizer frames to desired angles
$(\theta_{1},\theta_{2})$ and measure the effect on light intensity at
different wavelengths
($\tilde{I}_{1},\tilde{I}_{2},\tilde{I}_{3},\tilde{V}_{1},\tilde{V}_{2},\tilde{V}_{3}$).
We can manipulate sensor parameters like the exposure time of the camera
($T_{\text{Im}}$) or the photodiode used by the light sensors
($D^{I}_{1},D^{I}_{2},D^{I}_{3}$), further affecting the readings of these
sensors.

Figure 2: The causal chambers. (a) The wind tunnel. (b) The light tunnel with
the front panel removed to show its inner components. (c,d) Diagrams of the
chambers and their main components, including the amplification circuit that
drives the speaker of the wind tunnel and the variables for the light tunnel
camera. The variables measured by the chambers are displayed in black math
print. Sensor measurements are denoted by a tilde. Manipulable variables, that
is, actuators and sensor parameters, are shown in bold symbols (shown as non-
bold text elsewhere in the text). A detailed description of each variable is
given in App. II.

###  3 A Testbed for Algorithms

The chambers are designed to provide a testbed for a variety of algorithms
from AI, machine learning and statistics. To set up validation tasks, we rely
on two key properties of the chambers: that the encapsulated physical system
is well understood and that we can manipulate it. For example, by manipulating
actuators we can evaluate a learned causal model in its prediction of
interventional distributions. Or, in the case where the relationships between
actuators and sensors are well described by a natural law, we can set up a
symbolic regression task where we try to recover it from data. These are some
examples of the tasks we set up in our case studies in Sec. 4, but many other
possibilities exist.

Figure 3: Representation of the known effects for different chamber
configurations. Bold symbols correspond to manipulable variables, such as
actuators and sensor parameters (shown as non-bold text elsewhere in the
text). Sensor measurements are denoted by a tilde. (a,c) Standard
configurations of the chambers (b) “camera” configuration of the light tunnel,
including images from the light tunnel ($\tilde{\text{I}}$m) and the camera
parameters (Ap, ISO, $T_{\text{Im}}$). (d) “Pressure-control” configuration of
the wind tunnel, where the load fans $L_{\text{in}},L_{\text{out}}$ are set by
a control mechanism to maintain the chamber pressure $\tilde{P}_{\text{dw}}$
at a given level.

In Fig. 3, we provide a graphical representation of the physical system in
each chamber under different configurations, in the form of a directed graph
relating its variables. In their most basic form, the chambers operate in the
_standard configuration_ , where the value of all the actuators and sensor
parameters is explicitly given by the user in the experiment protocol (Fig.
1). The light tunnel operates without the camera to allow the fastest
measurement rate.

For additional flexibility in setting up validation tasks, the chambers can
also operate in _extended configurations_. For example, these can include
additional variables, such as those from the light-tunnel camera (Fig. 3b) or
additional sensors included in the future. Furthermore, the extended
configurations also allow us to assign the value of actuators and sensor
parameters as a function of other variables in the system, such as sensor
measurements. The assignment is done automatically by the computer onboard the
chamber and allows us to introduce additional complexity into the system. For
example, the “pressure-control” configuration of the wind tunnel (Fig. 3d)
implements a control mechanism that continuously updates the fan power
$(L_{\text{in}},L_{\text{out}})$ to keep the chamber pressure
($\tilde{P}_{\text{dw}}$) constant. The assignment functions can be any
stochastic or deterministic function that can be expressed in the Turing-
complete language that controls the chamber computer. While this yields a vast
space of possible configurations, for the moment, we only provide datasets
from the four configurations shown in Fig. 3.

In App. III, we provide a detailed description of all the effects (i.e.,
edges) in Fig. 3, based on background knowledge and carefully designed
experiments (see Fig. 7-Fig. 14). Furthermore, App. IV contains mechanistic
models that describe some of the effects, ranging from simple natural laws to
more complex models involving the technical specifications of the actual
components. For the more complex processes in the chambers, such as the image
capture in the light tunnel or the effects on the wind tunnel pressure, we
provide approximate models with increasing degrees of fidelity. In Fig. 6f, we
compare the output of some of these models to measurements gathered from the
chambers.

####  3.1 Causal Ground Truth

For readers with a background in causal inference, the graphs in Fig. 3 may be
reminiscent of causal graphical models [2, 3, 14]. In App. V, we formalize a
causal interpretation of the graphs and validate them with additional
randomized experiments. In short, an edge $X\to Y$ signifies that an
intervention on $X$ will change the distribution of subsequent measurements of
$Y$. This interpretation allows us to treat the graphs in Fig. 3 as causal
ground truths for a variety of causal inference tasks.

Under our interpretation, the absence of an edge between two variables does
not preclude the existence of a causal effect between them. As with most real
systems, effects between observed variables may exist beyond what we know or
can validate through the procedures described in this paper, due to a lack of
statistical power. Furthermore, there are confounding effects where unmeasured
variables simultaneously affect some of the variables in the chambers. For
example, variations in the atmospheric pressure outside the chambers
simultaneously affect all barometric measurements. We refer the reader to App.
V for more details.

###  4 Case Studies

Figure 4: Examples of data produced by the chambers. (a) Numeric time-series
data produced by the wind tunnel under an impulse on the intake fan load
($L_{\text{in}}$, red), affecting other variables in the system. (b,c)
numerical data from the light tunnel illustrating the effect of LED brightness
$(L_{11},L_{12})$ and polarizer angles ($\theta_{1},\theta_{2}$) on the light-
intensity readings ($\tilde{I}_{1},\tilde{I}_{2},\tilde{I}_{3}$). (d) Effect
of the light source setting $(R,G,B)$ on the light intensity reading of the
first sensor ($\tilde{I}_{1}$) and drawn current ($\tilde{C}$). (e) Examples
of images from the light tunnel for a fixed light source setting (reference)
and interventions on other variables that affect the resulting image.

We now show, through practical examples, how the chambers can be used to
validate algorithms from a variety of fields. As a starting point, we provide
a first collection of datasets and set up tasks from a selection of research
areas. Our choice is by no means exhaustive. We describe each field and the
corresponding tasks below and evaluate the performance of different
algorithms, showing the results in Fig. 5 and Fig. 6.

For each case study, we provide a detailed description of the experimental
procedure in App. I, together with well-documented code to reproduce the
experiments in the paper repository222github.com/juangamella/causal-chamber-
paper. See Sec. 6 for details on accessing the datasets.

###### Causal discovery (Fig. 5a)

By offering a causal ground truth and the ability to carry out interventions,
the chambers provide an opportunity to validate causal discovery algorithms
[[, e.g., ]]pearl2009causal, chickering2002optimal, peters2017elements,
Glymour2019ReviewOC, heinze2018causal, which aim to recover cause-and-effect
relationships from data. The chambers provide data suited to validate a wide
range of approaches, including those that rely on i.i.d. or time-series data
[19] with and without instantaneous or lagged causal effects, and causal
structures with and without cycles [20, 21]. We consider the task of
recovering the complete causal graph describing the effects in the system [22,
1, 23], and evaluate algorithms that take different types of data as input:
GES [24] for purely observational data, UT-IGSP [25] for interventional data
with unknown targets, and PCMCI+ [26] for time-series data. This constitutes
an example selection of methods that is not exhaustive. Performance is
measured by the recovery of the ground-truth graph (see Sec. 3.1). The results
are shown in Fig. 5a. For the i.i.d. data, GES and UT-IGSP recover the strong,
linear effects from the light-source setting ($R,G,B$) to the light-sensor
readings and drawn current. However, both methods struggle with the nonlinear
effects of the polarizer angles ($\theta_{1},\theta_{2}$) and the weak effects
of the additional LEDs ($L_{11},\ldots,L_{32}$), which are apparent only in
the cases when the light-source brightness is low or the polarizers are
crossed (Fig. 15). For the time-series data from the wind tunnel (task a3),
PCMCI+ displays a low recall, recovering the lagged and instantaneous effects
of the fan loads ($L_{\text{in}},L_{\text{out}}$) on the other fan variables
($\tilde{\omega}_{\text{in}},\tilde{\omega}_{\text{out}},\tilde{C}_{\text{in}},\tilde{C}_{\text{out}}$),
but failing to identify most other effects.

###### Out-of-distribution generalization (Fig. 5b)

By manipulating the chamber actuators and sensor parameters, we can induce
distribution shifts in a controlled manner. This enables us not only to test
the performance of prediction and inference algorithms on data sets with a
distribution that differs from the training distribution, but also to
investigate under which assumptions on the shifts such methods perform well
[27, 28, 29]. As an illustration, we set up three simple tasks with different
data modalities, as shown in Fig. 5b. The first consists of predicting the
light-intensity reading $\tilde{I}_{1}$ from the other numeric variables of
the light tunnel. We fit a simple linear regression with an increasing number
of predictors and evaluate its predictive performance on data arising from
interventions on the light source intensity ($R,G,B$), sensor parameters
($T^{I}_{2},T^{V}_{1},T^{V}_{2},T^{V}_{3}$) and polarizer alignment
($\theta_{1}$). For the second task, we predict the color setting $R,G,B$ of
the light source from the images captured by the camera. We employ a small
convolutional neural network [30], which we evaluate on shifts induced by
changing the distribution of colors, the polarizer angles, and the camera
parameters. The goal of the last task is to predict the hatch position $H$
from the pressure curve ($\tilde{P}_{\text{dw}}$) that results from applying a
short impulse to the load $L_{\text{in}}$ of the intake fan. We fit a simple
feed-forward neural network and validate its performance on curves collected
under different loads of the exhaust fan $L_{\text{out}}$, different barometer
precision ($O_{\text{dw}}$), and from a barometer in a different position
($\tilde{P}_{\text{up}}$). As expected, the performance of the methods
degrades under distribution shifts. Interestingly, the notion of causal
invariance [31] predicts the drop in performance of some models. For example,
the mean absolute error (MAE) incurred by predicting the training-set mean
(i.e., the empty model) remains constant across environments, except in those
where the causal parents of the response (see Fig. 3a) receive an intervention
(i.e., $R,G,B$ in tasks b1 and b2). In task b1, the model which includes only
causal parents ($\tilde{I}_{1}\sim R,G,B$) is most stable across all
enviroments, whereas models that include additional (non-causal) variables
achieve a better MAE in the training distribution but perform worse in
environments where these variables directly or indirectly receive an
intervention.

###### Change point detection (Fig. 5c)

Change point detection aims to identify abrupt changes or transitions in time-
series data or its underlying data-generating process [32]. By manipulating
actuators and sensor parameters, we can induce changes in the measurements of
the affected sensors, providing real datasets with a known ground truth in
terms of change points. To validate offline change point detection algorithms
[32, 33], we generate time-series data with smooth and abrupt changes of
increasing difficulty. We evaluate the non-parametric change-point detection
algorithm changeforest [34], displaying the results in Fig. 5c. As expected,
the method correctly recovers all change points in the deterministic time-
series of the actuator input $L_{\text{in}}$. For the affected sensors, the
method successfully detects abrupt changes in the signal or its regime, but
fails to detect more subtle changes (see $\tilde{C}_{\text{in}}$ or
$\tilde{M}$ in Fig. 5c).

###### Independent component analysis (Fig. 6d)

Independent component analysis (ICA) is a family of techniques that treat data
as a mixture of latent components and aim to discover a demixing
transformation that can accurately recover them [35, 36]. The linear variants
of ICA [37, 38] are well established, and recent developments in nonlinear ICA
have cast it as a framework that holds potential for effectively tackling the
challenge of disentanglement in complex data [35, 6]. We propose tasks that
consist of recovering (up to indeterminacies such as scaling) the values of
independently set actuators from the measurements of the sensors they affect.
As a starting point, we set up three tasks, shown in Fig. 6d: recovering the
light-source setting $(R,G,B)$ from the light-intensity measurements
($\tilde{I}_{1},\tilde{I}_{2},\tilde{I}_{3}$,
$\tilde{V}_{1},\tilde{V}_{2},\tilde{V}_{3}$); recovering the fan loads
($L_{\text{in}},L_{\text{out}}$) and hatch position ($H$) from the barometric
readings
($\tilde{P}_{\text{dw}},\tilde{P}_{\text{up}},\tilde{P}_{\text{amb}},\tilde{P}_{\text{int}}$),
and recovering the configuration of the light source and polarizers
($R,G,B,\theta_{1},\theta_{2}$) from the image data of the light tunnel. The
tasks display increasing difficulty in terms of dimensionality and the
complexity of the mixing transformation, which is approximately linear for the
first task (see Fig. 4d) and non-linear for the other two. As a first
baseline, we apply FastICA [38], which assumes a linear mixing function.
Indeed, the method succeeds in estimating the actuator inputs for the first
task, but struggles with the other two.

###### Symbolic regression (Fig. 6e)

Symbolic regression [12, 39] aims to discover mathematical equations or
expressions that best describe the underlying relationships in data, enabling
interpretable and compact model representations. A common motivation is the
automatic discovery of natural laws from data [4]. Because simple natural laws
well describe some of the relationships in the chambers, it is possible to
provide symbolic regression tasks from real data, and evaluate the performance
of such algorithms. As an example, we set up two tasks: recovering Bernoulli’s
principle, which relates the barometric measurements of the upwind and
downwind barometers ($\tilde{P}_{\text{up}},\tilde{P}_{\text{dw}}$), and
Malus’ law, which describes the effect of the linear polarizers
($\theta_{1},\theta_{2}$) on the light-intensity readings of the third sensor
($\tilde{I}_{3},\tilde{V}_{3}$). More details can be found in App. IV.1.3 and
IV.2.1, respectively. Bernoulli’s principle provides a task with a simple
ground-truth function but a low signal-to-noise ratio, while Malus’ law
provides a more complex function with weaker noise, representing two common
challenges for symbolic regression algorithms. We apply the method described
in [40] and show the results in Fig. 6e. Without fine-tuning its
hyperparameters, the method recovers both laws in at least one of five runs
with different random initializations.

###### Physics-informed machine learning (Fig. 6f)

Physics-informed machine learning integrates physical laws or domain-specific
knowledge into machine learning models to enhance their accuracy and
generalizability [41]. To validate such approaches, in App. IV we provide
mechanistic models of several processes in the chambers, derived from first
principles. For each process, we consider models of increasing complexity,
allowing us to simulate sensor measurements with varying degrees of fidelity.
This provides a testbed for simulation-based inference [42] and approaches
that exploit potentially misspecified models for inference or generation [43,
44, 45]. As an illustration, in Fig. 6f we compare measurements gathered from
the chambers with the output of some of these models. In particular, we show
the models describing the image capture process of the light tunnel, and the
effects of fan loads ($L_{\text{in}},L_{\text{out}}$) and hatch position ($H$)
on other wind tunnel variables
($\tilde{P}_{\text{dw}},\tilde{\omega}_{\text{in}},\tilde{\omega}_{\text{out}}$).
Their description, together with additional models and their outputs, can be
found in App. IV. To facilitate building additional models and simulators, we
provide in App. VI the datasheets for every chamber component, detailing its
technical specifications and physical properties.

Figure 5: Validating algorithms using the chambers (1/2). (a) Causal discovery
from light-tunnel and wind-tunnel data. The tasks consist of recovering the
causal graph from observational data and interventional data from the light
tunnel (tasks a1 and a2), and from time-series data from the wind tunnel (task
a3). We run a suitable method for each task (GES [16], UT-IGSP with
hyperparameter tuning [25], and PCMCI+ [26], respectively), and evaluate their
performance in the recovery of the causal structure of the corresponding
ground truth (see Sec. 3.1). GES and PCMCI+ return a set of 12 and 2 plausible
graphs, respectively, encoded by a graph with undirected edges [[, see e.g.,
]section 2.4.]chickering2002optimal. For these methods, we show the precision
and recall in the recovery of the directed ground-truth edges (c.f. equation
1, App. I) for the best- (bold) and worst-scoring graph in each set. (b)
Evaluating the out-of-distribution performance of regression methods. For each
task, we try to predict a sensor measurement or actuator value ($Y$) from
predictors ($X$) such as numeric measurements (task b1), images (task b2), or
impulse-response curves (task b3). We evaluate the predictive performance of
each method in terms of its mean absolute error (MAE) on a separate validation
set from the training distribution and shifted distributions arising from
manipulating the chamber variables. We display the MAE with spider charts,
where each axis corresponds to a different setting. As a baseline, we show the
MAE incurred when using the average of $Y$ in the training set as prediction
(black, dashed). For tasks b2 and b3, the MAE is averaged over 16 random
initializations of the model, with error bands corresponding to $\pm 1$
standard deviation. (c) Detecting change points in the time series of
different sensor measurements. We change the intake fan load ($L_{\text{in}}$)
at random time points while keeping all other actuators and sensor parameters
constant. Because the load affects all the displayed sensors, we take these
time points as ground truth (vertical dotted lines) and compare them with the
output of the change point detection algorithm (black crosses).

Figure 6: Validating algorithms using the chambers (2/2). (d) Applying
independent component analysis to disentangle the actuator inputs from sensor
readings (tasks d1 and d2) and image data (task d3). For each task, we show
the actuator values (top), the resulting images and measurements (center), and
the sources recovered by the FastICA algorithm [38] (bottom). For each
actuator, we show the recovered source with the highest Pearson correlation
coefficient. (e) Applying symbolic regression to recover (top) Bernoulli’s
principle from the difference in pressure at the up- and downwind barometers,
and (bottom) Malus’ law from light-intensity measurements. We show the output
of the method described in [40] for five runs with different random
initializations. The colors correspond (top) to the residual of the
observation w.r.t. the red line and (bottom) to the value of $\theta_{2}$. (f)
Mechanistic models of the chambers to simulate sensor measurements from
actuator inputs with varying degrees of fidelity. For a given set of inputs,
we show the outputs of models describing the fan speeds and air pressure in
the wind tunnel (top), and the image generation process of the light tunnel
(bottom). We compare the model outputs against the images and measurements
collected from the chambers (black lines). Higher model numbers imply more
complex models with increased fidelity. The models are defined in App. IV.

###  5 Discussion

We have constructed two devices to collect real-world datasets from well-
understood but non-trivial physical systems, with the aim of providing a
testbed beyond simulated data for a variety of empirical inference algorithms
in the broad field of AI. To illustrate their use, we have gathered an initial
collection of datasets and employed them in case studies exemplifying several
validation tasks. We believe many other possibilities exist. For example, the
fact that a computer controls the chambers makes it possible to validate a
variety of active learning, reinforcement learning, and control algorithms.

Well-understood systems allow us to provide suitable ground truths for
different tasks without relying on computer simulations and their simplifying
assumptions. Fundamentally though, well-understood mechanisms represent only a
small spectrum of complex, real systems. The success of an algorithm on the
chambers may not necessarily transfer to more complex systems. For example, a
causal discovery algorithm that excels in the chambers may fail to recover the
signaling network of a cell from protein expression data.

Our aim is that the chambers become a sanity check for algorithms designed to
work in a variety of situations. Failures in these testbeds can indicate
potential shortcomings in applications to more complex systems. This will
allow researchers to test and refine algorithms and methods, and consider
fundamental assumptions.

We make all datasets collected from the chambers publicly available, including
those used in the case studies of Sec. 4. Researchers can access them at
causalchamber.org and through the Python package causalchamber, for which we
provide an example in Sec. 6. We will continue to expand this dataset
repository, and we are open to suggestions of additional experiments that may
prove interesting—please reach out to the corresponding author.

We provide, also at causalchamber.org, the resources to allow other
researchers to build their own chambers. We believe this to be a key
contribution of our work, as having direct access to the chambers may be
crucial for some validation tasks. To begin with, the datasets we currently
provide amount only to a small fraction of all possible experiments, and are
unlikely to cover many interesting applications of the chambers. For
perspective, consider that the total number of distinct configurations of
actuators and sensor parameters exceeds $7\times 10^{15}$ for the wind tunnel
and $7\times 10^{41}$ for the light tunnel. For this reason, having access to
the chambers appears necessary to validate active learning, reinforcement
learning, and control algorithms, since schemes such as a look-up table can
quickly become unfeasible. Furthermore, the value of any benchmark based on a
few static datasets will decrease with its repeated use, due to over-fitting
and other effects.

###  6 Data availability

All datasets can be downloaded from causalchamber.org. We also provide a
Python API to directly download and import them into your code, through the
Python package causalchamber. The package can be installed via pip, e.g., by
running

⬇

>>> pip install causalchamber

in an appropriate shell. Datasets can then be accessed directly from Python
code. For example, to access the data from Malus’ law in the symbolic
regression task of Fig. 6e:

⬇

from causalchamber.datasets import Dataset

\par# Download the dataset

# and store it in the current directory

dataset = Dataset(name=’lt_malus_v1’, root=’./’)

\par# Load the observations

experiment = dataset.get_experiment(’white_255’)

df = experiment.as_pandas_dataframe()

Further examples can be found at causalchamber.org, together with a list of
all currently available datasets.

###  7 Code availability

The code to reproduce the case studies and figures can be found in the paper
repository at github.com/juangamella/causal-chamber-paper. The repository also
contains the blueprints, component lists and control code for the chambers.

### Acknowledgements

We would like to thank Manuel Cherep, Christopher Fuchs, Konstantin Göbler,
Christina Heinze-Deml, Jörn Jakobsen, Niklas Pfister, Antoine Wehenkel and
Tobias Windisch for their valuable discussions and comments on the manuscript.
We would also like to thank Niklas Stolz for his help with the design of the
polarizer frames of the light tunnel, and Claudio Linares and Helena Börjesson
for their help with the diagrams and photographs of the chambers. J.L. Gamella
and P. Bühlmann have received funding from the European Research Council (ERC)
under the European Union’s Horizon 2020 research and innovation program (grant
agreement No. 786461).

### References

  * [1] Peter Spirtes, Clark N. Glymour, Richard Scheines and David Heckerman  “Causation, Prediction, and Search”  MIT Press, 2000
  * [2] Judea Pearl  “Causality”  Cambridge University Press, 2009
  * [3] Jonas Peters, Dominik Janzing and Bernhard Schölkopf  “Elements of Causal Inference: Foundations and Learning Algorithms”  MIT Press, 2017
  * [4] Michael Schmidt and Hod Lipson  “Distilling Free-Form Natural Laws from Experimental Data”  In _Science_ 324.5923, 2009, pp. 81–85
  * [5] William La Cava, Patryk Orzechowski, Bogdan Burlacu, Fabricio Olivetti Franca, Marco Virgolin, Ying Jin, Michael Kommenda and Jason H. Moore  “Contemporary Symbolic Regression Methods and their Relative Performance”  In _35th Conference on Neural Information Processing Systems Datasets and Benchmarks Track (Round 1)_ , 2021
  * [6] Francesco Locatello, Stefan Bauer, Mario Lucic, Sylvain Gelly, Bernhard Schölkopf and Olivier Bachem  “Challenging Common Assumptions in the Unsupervised Learning of Disentangled Representations”  In _Proceedings of the 36th International Conference on Machine Learning_ , 2019, pp. 4114–4124
  * [7] Bernhard Schölkopf, Francesco Locatello, Stefan Bauer, Nan R. Ke, Nal Kalchbrenner, Anirudh Goyal and Yoshua Bengio  “Toward causal representation learning”  In _Proceedings of the IEEE_ 109.5 IEEE, 2021, pp. 612–634
  * [8] Pang W. Koh, Shiori Sagawa, Henrik Marklund, Sang Michael Xie, Marvin Zhang, Akshay Balsubramani, Weihua Hu, Michihiro Yasunaga, Richard L. Phillips, Irena Gao, Tony Lee, Etienne David, Ian Stavness, Wei Guo, Berton Earnshaw, Imran Haque, Sara M. Beery, Jure Leskovec, Anshul Kundaje, Emma Pierson, Sergey Levine, Chelsea Finn and Percy Liang  “Wilds: A benchmark of in-the-wild distribution shifts”  In _Proceedings of the 38th International Conference on Machine Learning_ , 2021, pp. 5637–5664
  * [9] Juan L. Gamella and Christina Heinze-Deml  “Active invariant causal prediction: experiment selection through stability”  In _Advances in Neural Information Processing Systems_ 33, 2020, pp. 15464–15475
  * [10] Konstantin Göbler, Tobias Windisch, Mathias Drton, Tim Pychynski, Martin Roth and Steffen Sonntag  “causalAssembly: Generating Realistic Production Data for Benchmarking Causal Discovery”  In _Causal Learning and Reasoning_ , 2024, pp. 609–642  PMLR
  * [11] Yuxiao Cheng, Ziqian Wang, Tingxiong Xiao, Qin Zhong, Jinli Suo and Kunlun He  “CausalTime: Realistically Generated Time-series for Benchmarking of Causal Discovery”  In _The Twelfth International Conference on Learning Representations_ , 2023
  * [12] Silviu-Marian Udrescu and Max Tegmark  “AI Feynman: A physics-inspired method for symbolic regression”  In _Science Advances_ 6.16 American Association for the Advancement of Science, 2020, pp. eaay2631
  * [13] Alex Greenfield, Aviv Madar, Harry Ostrer and Richard Bonneau  “DREAM4: Combining genetic and dynamic information to identify biological networks and dynamical models”  In _PloS one_ 5.10 Public Library of Science San Francisco, USA, 2010, pp. e13397
  * [14] Steffen L. Lauritzen  “Causal inference from graphical models”  In _Monographs on Statistics and Applied Probability_ 87 Chapman & Hall, 2001, pp. 63–108
  * [15] Judea Pearl  “Causal inference in statistics: An overview”  In _Statistics Surveys_ 3 The author, under a Creative Commons Attribution License, 2009, pp. 96–146
  * [16] David M. Chickering  “Optimal structure identification with greedy search”  In _Journal of Machine Learning Research_ 3, 2002, pp. 507–554
  * [17] Clark Glymour, Kun Zhang and Peter Spirtes  “Review of Causal Discovery Methods Based on Graphical Models”  In _Frontiers in Genetics_ 10, 2019
  * [18] Christina Heinze-Deml, Marloes H. Maathuis and Nicolai Meinshausen  “Causal structure learning”  In _Annual Review of Statistics and Its Application_ 5 Annual Reviews, 2018, pp. 371–391
  * [19] Jakob Runge  “Causal network reconstruction from time series: From theoretical assumptions to practical estimation”  In _Chaos: An Interdisciplinary Journal of Nonlinear Science_ 28.7 AIP Publishing, 2018
  * [20] Stephan Bongers, Patrick Forré, Jonas Peters and Joris M. Mooij  “Foundations of structural causal models with cycles and latent variables”  In _The Annals of Statistics_ 49.5 Institute of Mathematical Statistics, 2021
  * [21] Tom Claassen and Joris M. Mooij  “Establishing Markov equivalence in cyclic directed graphs”  In _Proceedings of the 39th Conference on Uncertainty in Artificial Intelligence_ , 2023, pp. 433–442
  * [22] Shohei Shimizu, Patrik O. Hoyer, Aapo Hyvärinen and Antti Kerminen  “A linear non-Gaussian acyclic model for causal discovery”  In _Journal of Machine Learning Research_ 7, 2006, pp. 2003–2030
  * [23] Peter Spirtes, Christopher Meek and Thomas Richardson  “An algorithm for causal inference in the presence of latent variables and selection bias”  In _Computation, Causation, and Discovery_ 21, 1999, pp. 211–252
  * [24] David M. Chickering  “A Transformational Characterization of Equivalent Bayesian Network Structures”  In _Proceedings of the 11th Conference on Uncertainty in Artificial Intelligence_ , 1995, pp. 87–98
  * [25] Chandler Squires, Yuhao Wang and Caroline Uhler  “Permutation-based causal structure learning with unknown intervention targets”  In _Proceedings of the 36th Conference on Uncertainty in Artificial Intelligence_ , 2020, pp. 1039–1048
  * [26] Jakob Runge  “Discovering contemporaneous and lagged causal relations in autocorrelated nonlinear time series datasets”  In _Proceedings of the 36th Conference on Uncertainty in Artificial Intelligence_ , 2020, pp. 1388–1397
  * [27] Vaishnavh Nagarajan, Anders Andreassen and Behnam Neyshabur  “Understanding the failure modes of out-of-distribution generalization”  In _Proceedings of the 8th International Conference on Learning Representations_ , 2020
  * [28] Robert Geirhos, Jörn-Henrik Jacobsen, Claudio Michaelis, Richard Zemel, Wieland Brendel, Matthias Bethge and Felix A. Wichmann  “Shortcut learning in deep neural networks”  In _Nature Machine Intelligence_ 2.11 Nature Publishing Group UK London, 2020, pp. 665–673
  * [29] Dominik Rothenhäusler, Nicolai Meinshausen, Peter Bühlmann and Jonas Peters  “Anchor regression: Heterogeneous data meet causality”  In _Journal of the Royal Statistical Society Series B (Statistical Methodology)_ 83.2 Royal Statistical Society, 2021, pp. 215–246
  * [30] Kunihiko Fukushima  “Neocognitron: A hierarchical neural network capable of visual pattern recognition”  In _Neural Networks_ 1.2, 1988, pp. 119–130
  * [31] Jonas Peters, Peter Bühlmann and Nicolai Meinshausen  “Causal inference by using invariant prediction: identification and confidence intervals”  In _Journal of the Royal Statistical Society: Series B (Statistical Methodology)_ 78.5 Wiley Online Library, 2016, pp. 947–1012
  * [32] Charles Truong, Laurent Oudre and Nicolas Vayatis  “Selective review of offline change point detection methods”  In _Signal Processing_ 167, 2020, pp. 107299
  * [33] Samaneh Aminikhanghahi and Diane J Cook  “A survey of methods for time series change point detection”  In _Knowledge and information systems_ 51.2 Springer, 2017, pp. 339–367
  * [34] Malte Londschien, Peter Bühlmann and Solt Kovács  “Random Forests for Change Point Detection”  In _Journal of Machine Learning Research_ 24.216, 2023, pp. 1–45
  * [35] Aapo Hyvärinen, Ilyes Khemakhem and Hiroshi Morioka  “Nonlinear independent component analysis for principled disentanglement in unsupervised deep learning”  In _Patterns_ 4.10 Elsevier, 2023
  * [36] Aapo Hyvärinen, Juha Karhunen and Erkki Oja  “Independent Component Analysis”  Wiley Interscience, 2001
  * [37] Aapo Hyvärinen and Erkki Oja  “Independent component analysis: algorithms and applications”  In _Neural networks_ 13.4-5 Elsevier, 2000, pp. 411–430
  * [38] Aapo Hyvarinen  “Fast and robust fixed-point algorithms for independent component analysis”  In _IEEE Transactions on Neural Networks_ 10.3 IEEE, 1999, pp. 626–634
  * [39] Miles Cranmer, Alvaro Sanchez Gonzalez, Peter Battaglia, Rui Xu, Kyle Cranmer, David Spergel and Shirley Ho  “Discovering symbolic models from deep learning with inductive biases”  In _Advances in Neural Information Processing Systems_ 33, 2020, pp. 17429–17442
  * [40] Pierre-Alexandre Kamienny, Stéphane d’Ascoli, Guillaume Lample and François Charton  “End-to-end symbolic regression with transformers”  In _Advances in Neural Information Processing Systems_ 35, 2022, pp. 10269–10281
  * [41] George E. Karniadakis, Ioannis G. Kevrekidis, Lu Lu, Paris Perdikaris, Sifan Wang and Liu Yang  “Physics-informed machine learning”  In _Nature Reviews Physics_ 3.6 Nature Publishing Group UK London, 2021, pp. 422–440
  * [42] Kyle Cranmer, Johann Brehmer and Gilles Louppe  “The frontier of simulation-based inference”  In _Proceedings of the National Academy of Sciences_ 117.48, 2020, pp. 30055–30062
  * [43] Naoya Takeishi and Alexandros Kalousis  “Physics-integrated variational autoencoders for robust and interpretable generative modeling”  In _Advances in Neural Information Processing Systems_ 34, 2021, pp. 14809–14821
  * [44] Antoine Wehenkel, Jens Behrmann, Hsiang Hsu, Guillermo Sapiro, Gilles Louppe and Joern-Henrik Jacobsen  “Robust Hybrid Learning With Expert Augmentation”  In _Transaction on Machine Learning Research_ , 2023
  * [45] Yuan Yin, Vincent Le Guen, Jérémie Dona, Emmanuel Bézenac, Ibrahim Ayed, Nicolas Thome and Patrick Gallinari  “Augmenting physical models with deep networks for complex dynamics forecasting”  In _Journal of Statistical Mechanics: Theory and Experiment_ 2021.12 IOP Publishing, 2021, pp. 124012
  * [46] Y. Lecun, L. Bottou, Y. Bengio and P. Haffner  “Gradient-based learning applied to document recognition”  In _Proceedings of the IEEE_ 86.11, 1998, pp. 2278–2324
  * [47] Yasuki Nakayama  “Introduction to fluid mechanics”  Butterworth-Heinemann, 2018
  * [48] Philip Leckner  “Ludwig’s Applied Process Design for Chemical and Petrochemical Plants Volume 1, By A. Kayode Coker”  In _Chemical Engineering_ 115.7 Access Intelligence, LLC, 2008, pp. 8–9
  * [49] Johann Tang  “Fan Basics: Air Flow, Static Pressure, and Impedance” Accessed: 2024-01-28, https://blog.orientalmotor.com/fan-basics-air-flow-static-pressure-impedance
  * [50] Edward Collett  “Field guide to polarization”  International society for opticsphotonics, 2005
  * [51] Jose Lages, Remo Giust and Jean-Marie Vigoureux  “Composition law for polarizers”  In _Physical Review A_ 78.3 APS, 2008, pp. 033810
  * [52] Nickolay Smirnov  “Table for estimating the goodness of fit of empirical distributions”  In _The Annals of Mathematical Statistics_ 19.2 Institute of Mathematical Statistics, 1948, pp. 279–281
  * [53] Henry B Mann and Donald R Whitney  “On a test of whether one of two random variables is stochastically larger than the other”  In _The Annals of Mathematical Statistics_ JSTOR, 1947, pp. 50–60

##  Appendix I Methods

In this appendix, we provide a brief description of the experimental setup for
each case study in Sec. 4, together with a link to the corresponding datasets
at causalchamber.org, and to the corresponding code in the paper repository at
github.com/juangamella/causal-chamber-paper.

### Case Study: Causal Discovery

All the methods we evaluate in this case study return a directed acyclic graph
(DAG) (or a set of them) as an estimate. Given a single DAG estimate
$\hat{G}:=(V,\hat{E})$ and a ground-truth graph $G^{\star}:=(V,E^{\star})$, we
compute the precision $P$ and recall $R$ in terms of directed edge recovery as

$\displaystyle P:=\frac{\hat{E}\cap E^{\star}}{|\hat{E}|}\text{ and
}R:=\frac{\hat{E}\cap E^{\star}}{|E^{\star}|},$ (1)

where $\hat{E}$ and $E^{\star}$ are the sets of directed edges in $\hat{G}$
and $G^{\star}$, respectively. If a method outputs several DAGs, we compute
$P$ and $R$ for each element in this set.

#### Task a1: Observational Data

Dataset | lt_interventions_standard_v1
---|---
Code | case_studies/causal_discovery_iid.ipynb

As input for GES, we take $10000$ observations from a subset of the variables
(see Fig. 5) in the uniform_reference experiment of the
lt_interventions_standard_v1 dataset. As score for the algorithm, we use the
BIC score with a Gaussian likelihood. GES returns the Markov equivalence class
of the estimated data-generating graph, and for each graph we compute the
corresponding precision and recall in the recovery of the edges in the ground-
truth graph.

#### Task a2: Interventional Data

Dataset | lt_interventions_standard_v1
---|---
Code | case_studies/causal_discovery_iid.ipynb

We consider the same subset of variables as for task a1, taking data from
several experiments in the lt_interventions_standard_v1 dataset as input for
UT-IGSP [25]. As “observational data”, we take the 10000 observations from the
uniform_reference experiment; as “interventional data” we take 1000
observations from each experiment where the considered variables receive an
intervention—see the accompanying code for the experiment names. For the
conditional independence and invariance tests, we use the default Gaussian
tests implemented in the Python package of UT-IGSP, and run the algorithm at
different significance levels $(\alpha,\beta)\in[10^{-4},10^{-2}]^{2}$. We
show the result for $\alpha=0.008,\beta=0.009$, which performs best in terms
of both precision and recall (1).

#### Task a3: Time-series Data

Dataset | wt_walks_v1
---|---
Code | case_studies/causal_discovery_time_series.ipynb

As input to PCMCI+ [26], we take $10000$ observations from a subset of the
variables in the actuators_random_walk_1 experiment of the wt_walks_v1
dataset. We run the method with partial correlation tests at significance
level $\alpha=1e-2$ and a maximum of $10$ lags. From the resulting estimate,
we drop edges from a variable to itself and edges for which orientation
conflicts arise. We compute the precision and recall (1) for each of the two
graphs in the resulting equivalence class.

### Case Study: Out-of-distribution generalization

#### Task b1: Regression from sensor measurements

Dataset | lt_interventions_standard_v1
---|---
Code | case_studies/ood_sensors.ipynb

We use the data from several experiments in the lt_interventions_standard_v1
dataset. We begin by splitting the observations from the uniform_reference
experiment into a training set (100 observations) and a validation set (1000
observations, shown with $\emptyset$ in the spider plot of Fig. 5b1). As
additional validation sets (1000 observations each), we select experiments
where the variables $R,G,B,T^{V}_{1},T^{V}_{2},T^{V}_{3},T^{I}_{2}$ and
$\theta_{1}$ receive an intervention—see the accompanying code for the
experiment names. These validation sets correspond to the additional axes in
the spider plot of Fig. 5b1. On the training set, we fit linear models with
intercept using ordinary least squares, with response $\tilde{I}_{1}$ and
different sets of predictors:
$\\{R\\},\\{R,G\\},\\{R,G,B\\},\\{R,G,B,\tilde{V}_{1}\\}$ and
$\\{\tilde{I}_{2},\tilde{I}_{3},\tilde{V}_{1},\tilde{V}_{2},\tilde{V}_{3}\\}$.
As a baseline, we consider the model that predicts the average of
$\tilde{I}_{1}$ in the training set. For each resulting model, we compute the
mean absolute error on each of the validation sets. The additional scatter
plot in Fig. 5b1 corresponds to the pooled data across all validation sets.

#### Task b2: Regression from images

Dataset | lt_color_regression_v1
---|---
Code | case_studies/ood_images.ipynb

We use the images from the lt_color_regression_v1 datasets, at a size of
$100\times 100$ pixels. We split the data from the reference experiment into a
training and validation set (9000 and 500 observations, respectively). As
additional validation sets, we take those arising from shifts in the
distribution of the response $R,G,B$ (bright_colors experiment) and from
interventions on the parameters of the camera—see the accompanying code for
the experiment names. We subsample each of the additional validation sets to a
size of $500$ observations. As a regression model, we employ a small LeNet-
like convolutional neural network [46]—see the code for more details. As a
loss function, we use the mean-squared error in predicting the light-source
settings $R,G,B$, which we minimize using stochastic gradient descent. We fit
the model a total of 16 times, each with a different random initialization of
the network weights. For each resulting model, we compute the mean absolute
error on each validation set, and plot the results in Fig. 5b2. As baseline,
we consider the model that predicts the average of $R,G,B$ in the training
set.

#### Task b3: Regression from impulse-response curves

Dataset | wt_intake_impulse_v1
---|---
Code | case_studies/ood_impulses.ipynb

We use the data from several experiments in the wt_intake_impulse_v1 dataset,
corresponding to different settings of the exhaust load $L_{\text{out}}$ and
oversampling rates $O_{\text{dw}}$ of the downwind barometer—see the
accompanying code for the experiment names. We split the data from the
load_out_0.5_osr_downwind_4 experiment into a training and validation set
(4000 and 900 observations, respectively). As a regression model, we employ a
multi-layer perceptron with an input layer of size 50 (the impulse length), an
output layer of size 1, and two additional hidden layers with 200 neurons and
ReLu activations. As a loss function, we use the mean-squared error in
predicting the hatch position $H$, and train the model using stochastic
gradient descent. We fit the model a total of 16 times, each with a different
random initialization of the network weights. For each resulting model, we
compute the mean absolute error on validation sets from the training
distribution and the additional experiments. Each corresponds to the different
axes in the spider plot of Fig. 5b3. As baseline, we consider the model that
predicts the average of $H$ in the training set.

### Case Study: Change point detection

Dataset | wt_changepoints_v1
---|---
Code | case_studies/changepoints.ipynb

We take the data from the load_in_seed_9 experiment in the wt_changepoints_v1
dataset, and apply the changeforest algorithm [34] to each of the time-series
$L_{\text{in}}$, $\tilde{\omega}_{\text{in}}$,
$\tilde{P}_{\text{dw}}-\tilde{P}_{\text{amb}}$, $\tilde{C}_{\text{in}}$, and
$\tilde{M}$. For the algorithm, we use the “random_forest” method and default
hyperparameters—see the accompanying code for details. As ground truth for the
changepoints (vertical gray lines in Fig. 5c), we take the time points where
$L_{\text{in}}$ is set to a new level. In all datasets collected from the
chambers, the column intervention takes a value of 1 for the first measurement
after an intervention on any of the chamber variables.

### Case Study: Independent Component Analysis

#### Task d1: Recovering light-source color

Dataset | lt_walks_v1
---|---
Code | case_studies/ica.ipynb

We use the color_mix experiment from the lt_walks_v1 dataset. As input to the
FastICA algorithm [38] we take the light-intensity measurements
$\tilde{I}_{1},\tilde{I}_{2},\tilde{I}_{3}$, $\tilde{V}_{1},\tilde{V}_{2}$ and
$\tilde{V}_{3}$, to which we first apply a whitening transformation. We run
the algorithm with 6 components (sources). For each ground-truth source
($R,G,B$), we show the recovered signal with the highest Pearson correlation
coefficient (in absolute value).

#### Task d2: Recovering fan loads and hatch position

Dataset | wt_walks_v1
---|---
Code | case_studies/ica.ipynb

We use the loads_hatch_mix_slow experiment from the wt_walks_v1 dataset. As
input to the FastICA algorithm [38] we take the barometric pressure
measurements
$\tilde{P}_{\text{dw}},\tilde{P}_{\text{up}},\tilde{P}_{\text{amb}}$ and
$\tilde{P}_{\text{int}}$, to which we first apply a whitening transformation.
We run the algorithm with 4 components (sources). For each ground-truth source
($L_{\text{in}},L_{\text{out}},H$), we show the recovered signal with the
highest Pearson correlation coefficient (in absolute value).

#### Task d3: Recovering actuators from images

Dataset | lt_camera_walks_v1
---|---
Code | case_studies/ica.ipynb

As input to the FastICA algorithm [38], we use the images from the
actuator_mix experiment in the lt_camera_walks_v1 dataset, at a size of
$50\times 50$ pixels. We first flatten the images, so that each pixel becomes
an input variable, applying a whitening transformation as an additional pre-
processing step. We run the algorithm with 5 components (sources). For each
ground-truth source ($R,G,B,\theta_{1},\theta_{2}$), we show the recovered
signal with the highest Pearson correlation coefficient (in absolute value).

### Case Study: Symbolic Regression

Datasets |  wt_bernoulli_v1,lt_malus_v1
---|---
Code | case_studies/symbolic_regression.ipynb

We use a pre-trained version of the model described in [40]—see the code for
more details. For both tasks, we employ the same hyperparameters as in the
demonstration provided by the authors333See the demonstration at
https://github.com/facebookresearch/symbolicregression/blob/main/Example.ipynb
and run the algorithm with 5 different random initializations. As input for
the first task, we randomly sample 1000 observations from the
random_loads_intake experiment in the wt_bernoulli_v1 dataset; for the second
task we use the 1000 observations from the white_255 experiment in the
lt_malus_v1 dataset. We show the estimated expressions in Fig. 6d, rounding
the constants to one decimal place.

### Case Study: Mechanistic Models

Datasets |  wt_test_v1, lt_camera_test_v1
---|---
Code | case_studies/mechanistic_models.ipynb

We compare the output of some of the models defined in App. IV to actual
measurements collected from the chamber. For the wind-tunnel models, we use
the steps experiment from the wt_test_v1, setting their parameters to the
values suggested in App. IV.1. For the models of the image-capture process of
the light tunnel, we take the images from the palette experiment in the
lt_camera_test_v1 dataset and use the parameters suggested in Section IV.2.2.
All models are implemented in the causalchamber Python package—see the
accompanying code for examples.

##  Appendix II Chamber Variables

This appendix documents the variables in each chamber, i.e., the actuators,
sensor parameters, and sensor measurements. A description of the physical
effects between them can be found in App. III.

### Wind Tunnel

Variables | Value range | Type | Component |  Description
---|---|---|---|---
$L_{\text{in}},L_{\text{out}}$ |  | $[0,1]$
---
(32-bit float)
A | fan |  The load of the fans, corresponding to the duty cycle of the pulse-width-modulation (PWM) signal that controls their speed. See the related datasheet in App. VI for more details.
$\tilde{C}_{\text{in}},\tilde{C}_{\text{out}}$ |  | $[0,1023]$
---
(32-bit float)
S | current_sensor |  The uncalibrated measurements of the electric current drawn by the fans. The calibrated measurements (in amperes) are given by ~C_in ×vref(Rin)1023 ×5 ×2.5  and  ~C_out ×vref(Rout)1023 ×5 ×2.5, where $\text{vref}(R_{\text{in}}),\text{vref}(R_{\text{out}})$ are the reference voltages of the corresponding sensors (see Table 3).
$\tilde{\omega}_{\text{in}},\tilde{\omega}_{\text{out}}$ |  |  $\geq 0$ (32-bit float)
---
S | fan |  The speed of the fans in revolutions per minute.
$T_{\text{in}},T_{\text{out}}$ | {0,1} | P | fan |  The resolution of the tachometer timer that measures the elapsed time between successive revolutions of the fan, where $1$ corresponds to microseconds and $0$ to milliseconds. Choosing microseconds yields a higher resolution in the fan-speed measurement.
| $\tilde{P}_{\text{up}},\tilde{P}_{\text{dw}}$
---
$\tilde{P}_{\text{amb}},\tilde{P}_{\text{int}}$
| $\geq 0$
---
(32-bit float)
S | barometer |  The barometric pressure, in pascals, as measured by the different barometers of the chamber. $\tilde{P}_{\text{int}}$ corresponds to the barometer placed at the tunnel intake. $\tilde{P}_{\text{amb}}$ is the ambient pressure measured by the outer barometer. $\tilde{P}_{\text{up}}$ and $\tilde{P}_{\text{dw}}$ correspond to the barometers inside the tunnel, which are placed facing into ($\tilde{P}_{\text{up}}$) and away ($\tilde{P}_{\text{dw}}$) from the airflow. Even at the same height and under the same conditions, the readings of the barometers have an offset resulting from the manufacturing process.
$A_{1},A_{2}$ | 0:255 | A | potentiometer |  The wiper position of the digital potentiometers in the speaker amplification circuit (Fig. 2c).
$\tilde{S}_{1},\tilde{S}_{2}$ |  | $[0,1023]$
---
(32-bit float)
S | arduino |  The amplitude of the signal after the first potentiometer ($\tilde{S}_{1}$) and after the second potentiometer ($\tilde{S}_{2}$) in the speaker amplification circuit (Fig. 2c). The calibrated amplitudes, in volts, are given by ~S_1 ×vref(R1)1023  and  ~S_2 ×vref(R2)1023, where $\text{vref}(R_{1}),\text{vref}(R_{2})$ are the reference voltages of the corresponding sensors (see Table 3).
$H$ | 0:45:0.1 | A | motor |  The position, in degrees, of the motor controlling the hatch that covers an additional opening of the wind tunnel. The position can be set in increments of $0.1^{\circ}$ degrees, with the hatch being closed at $0^{\circ}$ and fully open at $45^{\circ}$.
$\tilde{M}$ |  | $[0,1023]$
---
(32-bit float)
S | microphone |  The uncalibrated measurement of the sound level captured by the microphone. The calibrated signal amplitude, in volts, is given by ~M ×vref(RM)1023, where $\text{vref}(R_{M})$ is the reference voltage of the corresponding sensor (see Table 3).
| $R_{\text{in}},R_{\text{out}}$
---
$R_{1},R_{2}$
$R_{M}$
$\\{1.1,2.56,5\\}$ | P | arduino |  The reference voltages, in volts, of the sensors used to measure the current ($\tilde{C}_{\text{in}},\tilde{C}_{\text{out}}$), amplifier ($\tilde{S}_{1},\tilde{S}_{2}$) and microphone signals ($\tilde{M}$), respectively. The values differ slightly from the actual reference voltages seen by the sensors, which can be found in Table 3.
| $O_{\text{in}},O_{\text{out}}$
---
$O_{1},O_{2},O_{M}$
$O_{\text{up}},O_{\text{dw}}$
$O_{\text{amb}},O_{\text{int}}$
{1,2,4,8} | P | arduino |  The oversampling rates when taking measurements of the current ($\tilde{C}_{\text{in}},\tilde{C}_{\text{out}}$), amplifier ($\tilde{S}_{1},\tilde{S}_{2}$) and microphone signals ($\tilde{M}$), and of air pressure at the different barometers ($\tilde{P}_{\text{up}},\tilde{P}_{\text{dw}},\tilde{P}_{\text{amb}},\tilde{P}_{\text{int}}$). To avoid affecting the overall measurement time, the chambers always take the maximum number of readings (8) and discard excess readings accordingly.
Table 1: Description of the wind tunnel variables, including their symbol,
value range, type, and the related component for the datasheets in App. VI.
Variables are categorized into different types: actuators (A) or sensor
parameters (P), which can be directly manipulated, and sensor measurements
(S), which cannot be directly manipulated. For the value range, $n$:$m$
corresponds to the range $\\{n,n+1,\ldots,m\\}$ and $n$:$m$:$k$ to
$\\{n,n+k,n+2k,\ldots,m\\}$.

### Light Tunnel

Variables | Value range | Type | Component |  Description
---|---|---|---|---
$R,G,B$ | 0:255 | A | light_source |  The brightness setting of the red, green, and blue LEDs on the main light source. Higher values correspond to higher brightness.
$\tilde{C}$ |  | $[0,1023]$
---
(32-bit float)
S | current_sensor |  The uncalibrated measurement of the electric current drawn by the light source. The calibrated measurement (in amperes) is given by ~C ×vref(RC)1023 ×5 ×2.5, where $\text{vref}(R_{C})$ is the reference voltage of the corresponding sensor (see Table 3).
$\tilde{I}_{1},\tilde{I}_{2},\tilde{I}_{3}$ | 0:$2^{16}-1$ | S | light_sensor |  The uncalibrated infrared measurement of the light-intensity sensors, placed before ($\tilde{I}_{1}$), between ($\tilde{I}_{2}$), and after ($\tilde{I}_{3}$) the polarizers, in reference to the light source.
$\tilde{V}_{1},\tilde{V}_{2},\tilde{V}_{3}$ | 0:$2^{16}-1$ | S | light_sensor |  The uncalibrated visible-light measurement of the light-intensity sensors, placed before ($\tilde{V}_{1}$), between ($\tilde{V}_{2}$), and after ($\tilde{V}_{3}$) the polarizers, in reference to the light source.
$D^{I}_{1},D^{I}_{2},D^{I}_{3}$ | $\\{0,1,2\\}$ | P | light_sensor |  The photodiodes used by the light sensors to take infrared measurements, corresponding to the small $(D^{I}_{j}=0)$, medium $(D^{I}_{j}=1)$ and large $(D^{I}_{j}=2)$ infrared photodiodes onboard.
$D^{V}_{1},D^{V}_{2},D^{V}_{3}$ | $\\{0,1\\}$ | P | light_sensor |  The photodiodes used by the light sensors to take visible-light measurements, corresponding to the small $(D^{V}_{j}=0)$ and large $(D^{V}_{j}=1)$ photodiodes onboard.
| $T^{I}_{1},T^{I}_{2},T^{I}_{3}$
---
$T^{V}_{1},T^{V}_{2},T^{V}_{3}$
$\\{0,1,2,3\\}$ | P | light_sensor |  The exposure time of the photodiode during a light-intensity measurement. Higher values correspond to longer exposure times and increased sensitivity.
| $L_{11},L_{12},$
---
$L_{21},L_{22},$
$L_{31},L_{32}$
0:255 | A | led |  The brightness of LEDs placed by each light-intensity sensor, where $L_{i1},L_{i2}$ correspond to the two LEDs placed by the $i^{\text{th}}$ sensor ($\tilde{I}_{i},\tilde{V}_{i}$). The value corresponds to the wiper position of a digital rheostat, which controls the current flowing to the LED. Higher values correspond to increased brightness.
$\theta_{1},\theta_{2}$ | -180:180:0.1 | A | motor |  The setting of the stepper motors that control the angle of the polarizer frames, which can be set in increments of 0.1 degrees. Because the mechanism functions without feedback, the actual angle of the polarizers may slightly deviate from this setting due to the imperfect coupling of the mechanical pieces.
$\tilde{\theta}_{1},\tilde{\theta}_{2}$ |  | $[0,1023]$
---
(32-bit float)
S | angle_sensor |  The position of the polarizers is encoded into a voltage using a rotary potentiometer, which is then read by the control computer to produce the measurements $\tilde{\theta_{1}}$ and $\tilde{\theta_{2}}$. Given these measurements, the calibrated angle measurement is given as (~θ_j - Z_j) ×7201023 ×vref(Rj)5  degrees, where $\text{vref}(R_{j})$ is the reference voltage of the corresponding sensor (see Table 3), and $Z_{1}=507,Z_{2}=512$ are the readings at angles $\theta_{1}=\theta_{2}=0$ and reference voltages $R_{1}=R_{2}=5$.
$R_{C},R_{1},R_{2}$ | $\\{1.1,2.56,5\\}$ | P | arduino |  The reference voltage, in volts, of the sensors used to measure the current ($\tilde{C}$) and polarizer angles ($\tilde{\theta}_{1},\tilde{\theta}_{2}$), respectively. The values differ slightly from the actual reference voltages used by the sensors, which can be found in Table 3.
$O_{C},O_{1},O_{2}$ | {1,2,4,8} | P | arduino |  The oversampling rate of the sensors used to measure the current ($\tilde{C}$) and polarizer angles ($\tilde{\theta}_{1},\tilde{\theta}_{2}$), respectively. To avoid affecting the overall measurement time, the chambers always take the maximum number of readings (8) and discard excess readings accordingly.
$\tilde{\text{I}}\text{m}$ |  | 24-bit RGB
---
image
S | camera |  The color image produced by the camera, with a size of $2000\times 2000$ pixels and 8 bits per color channel.
Ap | cf. Table 4 | P | camera |  The $f$-number describing the aperture of the camera lens, with higher values corresponding to smaller openings.
ISO | cf. Table 4 | P | camera |  The gain of the camera sensor, where higher values correspond to higher sensitivity.
$T_{\text{Im}}$ | cf. Table 4 | P | camera |  The shutter speed of the camera, i.e., how many seconds the camera sensor is exposed when taking an image.
Table 2: Description of the light tunnel variables, including their symbol, value range, type, and the related component for the datasheets in App. VI. Variables are categorized into different types: actuators (A) or sensor parameters (P), which can be directly manipulated, and sensor measurements (S), which cannot be directly manipulated. For the value range, $n$:$m$ corresponds to the range $\\{n,n+1,\ldots,m\\}$. | Wind Tunnel | Light Tunnel
---|---|---
$R$ | $\text{vref}(R)$ | $\text{vref}(R)$
1.1 | 1.16 | 1.09
2.56 | 2.65 | 2.55
5 | 5 | 5
Table 3: Calibrated reference voltages for the wind tunnel ($R=R_{\text{in}},R_{\text{out}},R_{1},R_{2},R_{M}$) and the light tunnel ($R=R_{C},R_{1},R_{2},$). They are estimated using the analog_calibration experiments in the wt_test_v1 and lt_test_v1 datasets. Variable |  Values
---|---
Ap |  1.8, 2.0, 2.2, 2.5, 2.8, 3.2, 3.5, 4.0, 4.5, 5.0, 5.6, 6.3, 6.4, 7.1, 8.0, 9.0, 10, 11, 13, 14, 16, 18, 20, 22
ISO |  100, 125, 160, 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 8000, 10000, 12800, 16000, 20000, 25600, 32000, 40000, 51200
$T_{\text{Im}}$ |  1/200, 1/250, 1/320, 1/400, 1/500, 1/640, 1/800, 1/1000, 1/1250, 1/1600, 1/2000, 1/2500, 1/3200, 1/4000
Table 4: Possible values for the camera parameters controlling the aperture of
the lens (Ap), the sensor gain (ISO), and the shutter speed ($T_{\text{Im}}$).

##  Appendix III Description of Physical Effects

We describe the effects that the chamber actuators and sensor parameters have
on the measurements of each sensor. The effects correspond to the edges in the
ground-truth graphs of the standard configurations in Fig. 3, where an edge
$A\to B$ denotes that the actuator or sensor parameter $A$ has an effect on
the sensor measurement $B$. We justify each effect in terms of the chamber
design and the underlying physical principles, further characterizing each
effect through additional experiments (Fig. 7 to Fig. 17). As discussed in
Sec. 3.1, these effects can be understood as causal effects—see App. V for an
in-depth discussion and additional validation through randomized experiments.
Throughout this appendix, we use a short-hand notation for denoting multiple
effects e.g., $\\{A_{1},A_{2}\\}\to\\{B_{1},B_{2}\\}$ refers to the four edges
$A_{1}\to B_{1},A_{1}\to B_{2},A_{2}\to B_{1}$ and $A_{2}\to B_{2}$.

The code to generate the plots in this section can be found in the Jupyter
notebook case_studies/plots_appendices.ipynb in the paper repository
github.com/juangamella/causal-chamber-paper.

###  Appendix III.1 Wind Tunnel

Figure 7: Time-series data from different sensor measurements under varying
inputs to the fan loads ($L_{\textnormal{in}},L_{\textnormal{out}}$) and hatch
position ($H$), shown on the bottom row. (left) The measurements
$\tilde{P}_{\text{up}},\tilde{P}_{\text{dw}}$ of the inner barometers are
affected by both loads and the hatch position. (center) The fan speeds are
affected by their corresponding load. Because the fans are placed in tandem,
their speed is also affected by the load of the other fan, with the strength
of the effect depending on the hatch position (e.g., $t=100$). (right) Because
they share the same power supply, the load of one fan has a slight effect on
the current drawn by the other (e.g., $t=250$). The data and corresponding
experiment protocol can be found under the steps experiment in the wt_test_v1
dataset.

Figure 8: (left) Measurements of the fan speed $\tilde{\omega}_{\text{in}}$
under a progressive increase in the fan load $L_{\text{in}}$ for different
resolutions of the tachometer timer, with $(T_{\text{in}}=0)$ corresponding to
milliseconds and $(T_{\text{in}}=1)$ to microseconds. (right) Effect of the
barometer oversampling rate
($O_{\text{up}},O_{\text{dw}},O_{\text{amb}},O_{\text{int}}$) on the resulting
measurement
($\tilde{P}_{\text{up}},\tilde{P}_{\text{dw}},\tilde{P}_{\text{amb}},\tilde{P}_{\text{int}}$).
For all barometers, the oversampling rate is increased from 1 to 8 at $t=100$,
while keeping all other chamber actuators and sensor parameters constant. The
data and experimental setup for both plots can be found under the
tach_resolution and osr_barometers experiments in the wt_test_v1 dataset.

######
$L_{\textnormal{in}}\to\\{\tilde{C}_{\textnormal{in}},\tilde{\omega}_{\textnormal{in}}\\},L_{\textnormal{out}}\to\\{\tilde{C}_{\textnormal{out}},\tilde{\omega}_{\textnormal{out}}\\}$

The fan loads ($L_{\textnormal{in}},L_{\textnormal{out}}$) define the duty
cycle of the control signal sent to the fans, affecting their speed
($\tilde{\omega}_{\textnormal{in}},\tilde{\omega}_{\textnormal{out}}$) and the
current they consume
($\tilde{C}_{\textnormal{in}},\tilde{C}_{\textnormal{out}}$). We provide
mechanistic models describing these effects in Section IV.1.1, comparing their
outputs to real measurements in Fig. 16. When the load is set to zero, the fan
is completely powered off and no longer produces a tachometer signal (no
corresponding observation shown in Fig. 16); the resulting speed measurement
corresponds to the last measured speed (see Fig. 11).

######
$\\{L_{\textnormal{in}},L_{\textnormal{out}},H\\}\to\\{\tilde{\omega}_{\textnormal{in}},\tilde{\omega}_{\textnormal{out}}\\}$

Each fan drives the flow of air through the wind tunnel, in turn making it
easier or harder for the other fan to rotate. Thus, the speeds of the fans are
coupled, and the strength of the coupling is affected by the hatch position
(see Fig. 7, center).

######
$L_{\textnormal{in}}\to\tilde{C}_{\textnormal{out}},L_{\textnormal{out}}\to\tilde{C}_{\textnormal{in}}$

Because they share the same power supply, the load of one fan has a small
effect on the current drawn by the other (see Fig. 7, right).

######
$T_{\textnormal{in}}\to\tilde{\omega}_{\textnormal{in}},T_{\textnormal{out}}\to\tilde{\omega}_{\textnormal{out}}$

Changing the resolution ($T_{\textnormal{in}},T_{\textnormal{out}}$) of the
timers used in the fan tachometers also changes the resolution of the
resulting speed measurement
($\tilde{\omega}_{\textnormal{in}},\tilde{\omega}_{\textnormal{out}}$). Using
a resolution of microseconds (e.g., $T_{\textnormal{in}}=1$) allows measuring
smaller changes in the fan speed, with the difference being more noticeable at
higher speeds (see Fig. 8, left).

######
$\\{L_{\textnormal{in}},L_{\textnormal{out}},H\\}\to\\{\tilde{P}_{\textnormal{up}},\tilde{P}_{\textnormal{dw}}\\}$

By controlling the speed of the fans, the loads
($L_{\textnormal{in}},L_{\textnormal{out}}$) affect the air pressure inside
the wind tunnel, and thus the measurements of the two inner barometers
($\tilde{P}_{\textnormal{up}},\tilde{P}_{\textnormal{dw}}$). By controlling
the size of the additional opening to the outside, the hatch position ($H$)
also affects the pressure inside the tunnel (Fig. 7). We provide mechanistic
models describing these effects in App. IV.1.

######
$\\{L_{\textnormal{in}},L_{\textnormal{out}},H\\}\to\tilde{P}_{\textnormal{int}}$

The fan loads and hatch position also affect the airflow and air pressure at
the intake of the tunnel.

######
$O_{\textnormal{up}}\to\tilde{P}_{\textnormal{up}},O_{\textnormal{dw}}\to\tilde{P}_{\textnormal{dw}},O_{\textnormal{amb}}\to\tilde{P}_{\textnormal{amb}},O_{\textnormal{int}}\to\tilde{P}_{\textnormal{int}}$

The oversampling rate determines how many barometric readings are averaged to
produce a single measurement of the air pressure. A higher oversampling rate
increases the precision of the barometers, reducing the noise in their
measurements (see Fig. 8, right).

######
$\\{R_{\textnormal{out}},O_{\textnormal{out}}\\}\to\tilde{C}_{\textnormal{out}},\\{R_{\textnormal{in}},O_{\textnormal{in}}\\}\to\tilde{C}_{\textnormal{in}}$

The current sensors encode their reading of the current as a voltage between 0
and 5 volts. This voltage is then read by the onboard computer, linearly
mapping the range of $[0,R_{\text{in}}]$ ($[0,R_{\text{out}}]$) volts to
$[0,1023]$. Thus, reducing the reference voltages
$R_{\text{in}},R_{\text{out}}$ increases the resolution of the current
measurements (see Fig. 12, right), but can also cause the measurements to
saturate if the voltage surpasses the reference voltage. As for the
barometers, the oversampling rate ($O_{\text{in}},O_{\text{out}}$) determines
the number of readings that are averaged to produce a single measurement, thus
affecting the precision of the measurements (see Fig. 12, left).

###### $A_{1}\to\\{\tilde{S}_{1},\tilde{S}_{2}\\},A_{2}\to\tilde{S}_{2}$

The signal fed to the speaker amplification circuit (Fig. 2c) is binary white
noise with a period of $40\mu s$: after every period the voltage is set to $0$
or $5$ volts with equal probability and is statistically independent of
previous voltages. The two potentiometers act as controllable voltage
dividers, affecting the amplitude of the signal at different points of the
circuit. Thus, the first potentiometer ($A_{1}$) affects the measurements
$\tilde{S}_{1},\tilde{S}_{2}$, whereas the second potentiometer ($A_{2}$) only
has an effect on the measurement $\tilde{S}_{2}$ (Fig. 9).

###### $\\{R_{1},O_{1}\\}\to\tilde{S}_{1},\\{R_{2},O_{2}\\}\to\tilde{S}_{2}$

As for the current measurements, the reference voltages $R_{1},R_{2}$ and
oversampling rates $O_{1},O_{2}$ have an effect on the resulting measurements
$\tilde{S}_{1},\tilde{S}_{2}$.

###### $A_{1}\to\tilde{M}$

The setting of the first potentiometer ($A_{1}$) controls the amplitude of the
signal that is sent to the speaker, affecting the sound-level measurement
$\tilde{M}$ taken by the microphone (Fig. 9, left).

######
$\\{L_{\textnormal{in}},L_{\textnormal{out}},H\to\tilde{M}\\}\to\tilde{M}$

The speed of the fans, controlled by the loads
$L_{\textnormal{in}},L_{\textnormal{out}}$, have an effect on the sound level
$\tilde{M}$ measured by the microphone (see Fig. 10, left). The position of
the hatch affects the amount of air flowing through the exhaust and over the
microphone, also affecting its reading (Fig. 10, center).

###### $\\{R_{M},O_{M}\\}\to\tilde{M}$

As for the other sensors, the reference voltage affects the resolution of the
microphone signal measurement and can induce saturation if the signal voltage
rises above it. The oversampling rate $O_{M}$ determines the Nyquist frequency
of the system and can introduce aliasing in the resulting signal (Fig. 10,
right).

Figure 9: (left) Time-series data of $\tilde{S}_{1},\tilde{S}_{2}$ and the
microphone output $\tilde{M}$, collected under the inputs $A_{1},A_{2}$ to the
amplification circuit potentiometers (bottom left), while all other actuators
and sensor parameters are kept constant. The setting of the first
potentiometer $A_{1}$ determines the maximum amplitude of the signals
$\tilde{S}_{1},\tilde{S}_{2}$ (center) and of the signal sent to the speaker,
affecting the microphone output $\tilde{M}$ (left, gold). The setting of the
second potentiometer $A_{2}$ only affects the maximum amplitude of
$\tilde{S}_{2}$ (left), and the effect is linear for a fixed value of $A_{1}$
(right). The data and experimental setup for the plots can be found under the
potis_coarse and potis_fine experiments in the wt_test_v1 dataset.

###### $\tilde{P}_{\text{dw}}\to\\{L_{\text{in}},L_{\text{out}}\\}$

In the _pressure-control_ configuration of the wind tunnel, the fan loads
$L_{\text{in}},L_{\text{out}}$ are set following a control mechanism to keep
the pressure measured at the downwind barometer ($\tilde{P}_{\text{dw}}$)
constant. In particular, the loads of the fans are set as

$L_{\text{in}}\leftarrow\begin{cases}\min(1,u(t))&\text{ if }u(t)>0\\\
0&\text{ otherwise}\end{cases}\quad\text{and}\quad
L_{\text{out}}\leftarrow\begin{cases}\min(1,-u(t))&\text{ if }u(t)<0\\\
0&\text{ otherwise}\end{cases}$

where $u(t)$ is the controller output of the PID controller given by

$u(t):=K_{p}e(t)+K_{i}\sum_{\tau=0}^{t}e(t)+K_{d}(e(t)-e(t-1)),$

where $e(t):=T-\tilde{P}_{\text{dw}}^{t}$ is the control error, i.e., the
difference in the pressure target $T$ and the measurement
$\tilde{P}_{\text{dw}}^{t}$ of the downwind barometer at time point $t$. For
the wt_pressure_control_v1 dataset, we set
$(K_{p},K_{i},K_{d}):=(0.5,0.1,10^{-3})$ and set as pressure target $T$ the
first measurement $\tilde{P}_{\text{dw}}^{0}$ taken by the downwind barometer
after the chamber powers up. The control mechanism is executed internally by
the chamber computer, producing a new output $u(t)$ at every time step. The
related variables, i.e., target $T$, control constants $K_{p},K_{i},K_{d}$,
output $u(t)$ and error terms $e(t),\sum_{\tau=0}^{t}e(t)$ and
$(e(t)-e(t-1))$, are returned with each measurement as additional columns in
datasets collected from the pressure-control configuration.

Figure 10: (left) Time-series data of the microphone output $\tilde{M}$
collected under varying inputs to the fan loads $L_{\text{in}},L_{\text{out}}$
and the hatch position $H$ (bottom left). All three actuators have an effect
on the microphone output. (center) Marginal distribution of the microphone
output $\tilde{M}$ for $L_{\text{in}}=1,L_{\text{out}}=0$ (top) and
$L_{\text{in}}=0,L_{\text{out}}=1$ (bottom), corresponding to the regions
marked in the time-series plot on the left. The hatch affects the amount of
air that flows through the exhaust of the tunnel and over the microphone,
affecting its readings. The effect of opening the hatch ($H=45$) is dependent
on the loads of the fans, decreasing the airflow when
$L_{\text{in}}=1,L_{\text{out}}=0$ and increasing it when
$L_{\text{in}}=0,L_{\text{out}}=1$. (right) The oversampling rate determines
the Nyquist frequency of the microphone system, introducing aliasing in the
resulting signal. The data and experimental setup for the plots can be found
in the mic_effects experiment in the wt_test_v1 dataset.

Figure 11: By setting a fan load to zero (e.g., $L_{\text{out}}\leftarrow 0$
at $t=125$), the fan is completely powered off and will decelerate until it
stops rotating; however, at zero load, the fan no longer produces a tachometer
signal, and the resulting speed measurement $\tilde{\omega}_{\text{out}}$
corresponds to the last measured speed (e.g., $t\in[125,200]$). When powered
up again ($t=200$) the fan always draws full power for an instant, quickly
accelerating before returning to the level specified by the load. The data and
experimental setup for the plot can be found under the zero_load experiment in
the wt_test_v1 dataset.

###  Appendix III.2 Light Tunnel

Figure 12: Effect of the reference voltage $R_{C}$ and oversampling rate
$O_{C}$ on the measurements $\tilde{C}$ of the current drawn by light source,
when its brightness ($R,G,B$) is kept constant. The oversampling rate
determines the amount of readings that are averaged to produce a single
measurement, affecting the precision of the sensor (left). For a constant
oversampling rate ($O_{C}=1$), changing the reference voltage results in a
shift of the sensor output (middle) and an increase in the resolution of the
calibrated measurement (right). While the plots show the current measurement
$\tilde{C}$ in the light-tunnel, the same principles apply for the other
sensors which encode their measurement as voltage
($\tilde{\theta}_{1},\tilde{\theta}_{2},\tilde{M},\tilde{S}_{1},\tilde{S}_{2}$)
and for the wind-tunnel barometers
($\tilde{P}_{\text{dw}},\tilde{P}_{\text{up}},\tilde{P}_{\text{amb}},\tilde{P}_{\text{int}}$),
which also allow for varying oversampling rates
($O_{\text{dw}},O_{\text{up}},O_{\text{amb}},O_{\text{int}}$). The data
corresponds to the current_sensor experiment from the lt_test_v1 dataset.
Figure 13: Effect of the photodiode size ($D^{I}_{1}$) and exposure time
($T^{I}_{1}$) on the infrared measurements ($\tilde{I}_{1}$) of the light
sensor nearest the light source. We display the output $\tilde{I}_{1}$ of the
sensor for varying brightness of the red LEDs on the light source ($R$), while
keeping $G=B=0$ and all other actuators constant. Increasing the photodiode
size (left) or exposure time (center) both increase the sensitivity of the
sensor. Due to an interplay between the exposure time and the pulse-width-
modulation frequency of the light source, changes in the exposure time also
affect the conditional distribution of the measurements given the light-source
intensity ($R,G,B$). For example, when comparing the measurements for
$T^{I}_{1}=2$ and $T^{I}_{1}=3$ in the rightmost panel (same data as in the
center panel, but vertically scaled for comparison), we can see a difference
in the variance as a function of $R$. The effects on the visible-light
measurements $\tilde{V}_{1}$ follow the same principles and are not shown. The
data corresponds to the ir_sensors experiment from the lt_test_v1 dataset.

######
$\\{R,G,B\\}\to\\{\tilde{I}_{1},\tilde{I}_{2},\tilde{I}_{3},\tilde{V}_{1},\tilde{V}_{2},\tilde{V}_{3}\\}$

The brightness settings of the light-source colors $(R,G,B)$ affect the
readings of all light-intensity sensors. The effect of each color is
approximately linear with heteroscedastic noise (Fig. 4d), with the slope
determined by its typical wavelength and the spectral sensitivity of the
sensor (see light_source and light_sensor components in App. VI).

###### $\\{R,G,B\\}\to\tilde{C}$

The brightness settings also affect the electric current drawn by the light
source. The effect is again approximately linear with roughly the same slope
for each channel (see Fig. 4d).

###### $\\{R_{C},O_{C}\\}\to\tilde{C}$

As for the wind-tunnel, the sensor measuring the current drawn by the light
source encodes its reading into a voltage between 0 and 5 volts. This voltage
is then read by the onboard computer, linearly mapping the range of
$[0,R_{C}]$ volts to $[0,1023]$. Thus, reducing the reference voltage $R_{C}$
increases the resolution of the current measurements (see Fig. 12, right). The
oversampling rate ($O_{C}$) determines the number of readings that are
averaged to produce a single measurement, affecting its precision (Fig. 12,
left).

######
$\\{D^{I}_{j},T^{I}_{j}\\}\to\tilde{I}_{j},\\{D^{V}_{j},T^{V}_{j}\\}\to\tilde{V}_{j}$

The measurements of each light sensor are affected by the choice of photodiode
($D^{I}_{j},D^{V}_{j}$) and gain ($T^{I}_{j},T^{V}_{j}$) used to perform the
infrared ($\tilde{I}_{j}$) and visible-light ($\tilde{V}_{j}$) readings.
Larger photodiodes collect light over a larger area, increasing the
sensitivity of the sensor (Fig. 13, left). Higher exposure times achieve a
similar effect by increasing the reading duration, which also has an effect on
the conditional distribution of the measurements given the light source
brightness (Fig. 13, right). A timing mechanism ensures that changes in the
exposure time do not affect the overall measurement time.

###### $\\{\theta_{j},R_{j},O_{j}\\}\to\tilde{\theta}_{j}$

The motor settings $\theta_{1},\theta_{2}$ determine the positions of the
polarizer frames. The positions are encoded into a voltage by means of rotary
potentiometers, resulting in the measurements
$\tilde{\theta}_{1},\tilde{\theta}_{2}$. Changes in the reference voltages
$R_{1},R_{2}$ affect the resolution of the measurements, but can also cause
the sensor to saturate (see Fig. 14, left). The oversampling rates
($O_{1},O_{2}$) determine the number of readings that are averaged to produce
a single measurement, affecting its precision (Fig. 14, right).

######
$\\{\theta_{1},\theta_{2}\\}\to\\{\tilde{I}_{3},\tilde{V}_{3},\tilde{\textmd{I}}\textmd{m}\\}$

The position of the polarizers affects the intensity and spectral composition
(i.e., color) of the light passing through them, affecting the readings
($\tilde{I}_{3},\tilde{V}_{3}$) of the third light sensor (see Fig. 4c and
Fig. 17) and the images ($\tilde{\textmd{I}}\textmd{m}$) captured by the
camera (see Fig. 4e). The effect is described by Malus’ law—see Section IV.2.1
for more details.

###### $\\{\textmd{Ap},\textmd{ISO},T\\}\to\tilde{\textmd{I}}\textmd{m}$

The camera parameters affect the brightness of the captured images while
introducing a variety of side effects (Fig. 4e). For example, a higher gain
(ISO) increases the noise, while the aperture (Ap) changes the depth of field,
introducing blur.

###### $\\{L_{j1},L_{j1}\\}\to\tilde{I}_{j},\tilde{V}_{j}$

Besides the light source, two additional LEDs by each sensor (see Fig. 2d)
have an effect on its reading. The LEDs only turn on when the sensor is taking
a measurement, and their brightness is controlled by means of digital
rheostats that control the current flowing to each LED. The settings
$L_{j1},L_{j2}$ correspond to the wiper position of each rheostat. The
relationship between the setting and the intensity readings follows an
exponential function (Fig. 4b), resulting from the LED’s voltage-current
characteristic, luminosity response and typical wavelength, and the spectral
sensitivity of the sensor. The brightness of the LEDs is much lower than that
of the light source (Fig. 15). See the led and light_sensor components in App.
VI for the corresponding datasheets.

Figure 14: Effect of the reference voltage ($R_{1}$) and oversampling rate
($O_{1}$) on the angle measurements of the first polarizer
($\tilde{\theta}_{1}$). (left) We show the calibrated measurements of the
angle sensor (see LABEL:tab:light_tunnel_vars for details) for different
values of the motor setting $\theta_{1}$ and reference voltages $R_{1}$, while
keeping the oversampling rate constant at $O_{1}=1$. Lowering the reference
voltage $R_{1}$ results in a saturation of the sensor, being completely
saturated (i.e., returning a constant reading) at $R_{1}=1.1$. (right)
Uncalibrated measurements $\tilde{\theta}_{1}$ for a constant motor setting
$\theta_{1}=0$ and reference voltage $R_{1}=5$. The stochasticity of the
measurement is due to electrical noise in the voltage measurement—increasing
the oversampling rate $O_{1}$ increases the precision of the sensor. The same
principles apply to the measurements $\tilde{\theta}_{2}$ of the second angle
sensor. The data corresponds to the angle_sensors experiment from the
lt_test_v1 dataset. Figure 15: Effect of the LED brightness settings
($L_{31},L_{32}$) on the reading $\tilde{I}_{3}$ of the third light sensor,
which is separated from the light source by both polarizers. The light source
colors $R,G,B$ and brightness settings $L_{11},\ldots L_{32}$ are sampled
independently and uniformly at random from the range $\\{0,\ldots,255\\}$, and
the polarizer angles $\theta_{1},\theta_{2}$ from $[-15,105]$. In both plots,
the color corresponds to $R,G,B$, and the size to $L_{32}$. Because the
brightness of the LEDs is very small when compared to that of the light
source, their effect on the intensity reading $\tilde{I}_{3}$ is barely
noticeable when looking at all observations (left), but becomes apparent, for
example, when the polarizers are close to orthogonal (right) and block most of
the light emanating from the light source. The data corresponds to the
actuators_white experiment from the lt_walks_v1 dataset.

##  Appendix IV Mechanistic Models of The Chambers

This appendix provides mechanistic models describing several of effects and
processes in the causal chambers. Each model is labeled with a letter and a
number (e.g., B1, C2); different letters correspond to different modeled
quantities, and higher numbers mean increased fidelity. A Python
implementation of each model can be found in github.com/juangamella/causal-
chamber, and is accessible through the causalchamber package; examples and the
code to generate the plots in this section can be found in the Jupyter
notebook case_studies/mechanistic_models.ipynb in the paper repository
github.com/juangamella/causal-chamber-paper.

Excluding models D1 and F1–F3, the models in this section are agnostic to
phenomena arising from the sensors that measure the modeled physical
quantities, such as measurement and quantization noise, saturation, or non-
linearities in their response. For this reason, we denote the modeled
quantities without a tilde (e.g., $\omega_{\text{in}},P_{\text{dw}},I_{3})$ to
differentiate them from the corresponding sensor measurements (e.g.,
$\tilde{\omega}_{\text{in}},\tilde{P}_{\text{dw}},\tilde{I}_{\text{3}})$.

###  Appendix IV.1 Wind Tunnel

We provide models describing the effect of the fan load on the speed of the
fans and the drawn current (Sec. IV.1.1); the effect of the fan loads and
hatch position on the reading of the downwind barometer (Sec. IV.1.2); and the
difference between the readings of the up- and downwind barometers, as
described by Bernoulli’s principle (Sec. IV.1.3).

Figure 16: Comparing model predictions with real measurements. (left and
center): models B1 and A1 of the drawn current and speed of the fans,
respectively, as a function of the load $L_{\text{in}}$, compared to steady-
state measurements from the wt_bernoulli_v1 dataset. When the load is set to
zero, the fan is completely powered off and no longer produces a tachometer
signal (not shown)—see also Fig. 11. (right) Output of the models B1, A1 and
A2 for time-series data from the wt_test_v1 dataset. The parameters of all
models are set as in Sec. IV.1.1.

The fans used in the wind-tunnel are high-speed fans for industrial cooling
applications. Their speed is controlled via pulse-width-modulation (PWM),
where the pulse-width, or duty cycle, corresponds to the fan loads
$L_{\text{in}}$ and $L_{\text{out}}$ of the wind tunnel. Additional details
and technical specifications of the fans can be found in the datasheets of
App. VI, under the fan component. As we derive the different models of this
section, we will refer to these datasheets for the values of certain model
parameters.

####  IV.1.1 Effect of the fan load on fan speed and drawn current

Two important aspects of the fans’ design are used throughout the models of
the fan speed (A1, A2) and drawn current (B1): first, the fans are designed so
their steady-state speed scales broadly linearly with the load. At full load,
the fans turn at a maximum speed $\omega_{\text{max}}$, which is specified by
the manufacturer as $314.16\text{ rad}/\text{s}$ (3000 RPM). Second, due to
their intended application, unless completely powered off (i.e.,
$L_{\text{in}},L_{\text{out}}=0$) the fans never operate below a certain
speed, corresponding to a minimum effective load which we denote by
$L_{\text{min}}$. This value is specified by the manufacturer to be around
$0.2$, but our experiments show it to be closer to $0.1$ (see Fig. 16,
center).

##### Model A1

We model the steady-state speed $\omega$ of the fan under a load $L$ as

$\displaystyle\omega=\begin{cases}\max(L,L_{\text{min}})\omega_{\text{max}}&\text{if
}L>0\\\ 0&\text{if }L=0\end{cases}$ (2)

where $\Theta:=(\omega_{\text{max}},L_{\text{min}})$ are the parameters of the
model. The first two correspond to the maximum speed of the fan and the
minimum effective load. From the datasheets and our experiments, we can set
$L_{\text{min}}=0.1$ and $\omega_{\text{max}}=314.16\text{ rad}/\text{s}$ (see
Fig. 16, left).

##### Model B1

We model the effect of fan load on its drawn current through the affinity laws
[[, e.g., ]section 9.3.5]nakayama2018introduction, which state that the power
$W$ consumed by a fan is proportional to the cube of its speed $\omega$, that
is, $W=W_{\text{max}}(\omega/\omega_{\text{max}})^{3}$, where $W_{\text{max}}$
is the power consumed by the fan at its maximum speed $\omega_{\text{max}}$.
Because the fans operate at a constant voltage, we can rewrite the above
expression in terms of the drawn current $C$ as
$C=C_{\text{max}}(\omega/\omega_{\text{max}})^{3}$, where $C_{\text{max}}$ is
the current drawn at maximum speed. Accounting for the no-load current
$C_{\text{min}}$ of the motor, and combining the above with model A1 of the
fan speed, we arrive at the model

$\displaystyle
C=\begin{cases}C_{\text{min}}+\max(L_{\text{min}},L)^{3}(C_{\text{max}}-C_{\text{min}})&\text{if
}L>0\\\ C_{\text{min}}&\text{if }L=0\end{cases}$ (3)

where $\Theta:=(L_{\text{min}},C_{\text{min}},C_{\text{max}})$ are the
parameters of the model. As before, we can set $L_{\text{min}}=0.1$; from the
datasheet we can set the nominal current of the fan to $C_{\text{max}}=0.26$
A, and empirically determine the no-load current to be approximately
$C_{\text{min}}=0.166$ A.

##### Model A2

To model the dynamics of the fan speed beyond the steady state, we express the
change in the speed through the torque-balance equation

$\displaystyle d\omega=\frac{1}{I}(\tau(L)-K\omega^{2})dt,$ (4)

where $I$ is the fan’s moment of inertia, $\tau(L)$ is the torque applied by
the fan motor for a given load $L$, and $K\omega^{2}$ is the opposing torque
due to the drag experienced by the fan. Here, $K$ is a constant that depends
on the geometry of the blades and the density of the air [[, e.g., ]section
9.3.5]nakayama2018introduction. These constitute the parameters
$\Theta:=(I,\tau(L),K)$ of our model, which we approximate as follows:

  * •

We model the fan as a solid cylinder, resulting in a moment of inertia
$I=\frac{1}{2}mr^{2}$, where $m,r$ are the mass and radius of the disc,
respectively. The fan has a radius of $r=0.059$m, and we estimate its mass as
$m=0.02$kg, resulting in $I=3.48\times 10^{-5}\text{kg}/\text{m}^{2}$.

  * •

We approximate the load-to-torque function as

$\tau(L):=\begin{cases}T(\max(L_{\text{min}},L)^{3}(C_{\text{max}}-C_{\text{min}}))&\text{if
}L>0\\\ 0&\text{if }L=0\end{cases}$

where $T$ is the torque constant of the motor and the remaining terms
correspond to the drawn current as described by model B1 (after substracting
the no-load current $C_{\text{min}}$). In Fig. 16 and Fig. 6f, we set
$T=0.05\text{Nm}/\text{A}$.

  * •

To obtain a value for the constant $K$ in our model, we solve the steady-state
equation $d\omega=\frac{1}{I}(\tau(1)-K\omega_{\text{max}}^{2})=0$ with $I$
and $\tau(L)$ as above, resulting in $K=5.26\times 10^{-8}$.

In Fig. 16 we compare the output of the models A1 and A2 to real measurements
collected from the chamber. An important source of misspecification is that we
model the intake and exhaust fans independently, whereas in the tunnel their
speeds affect each other (see Fig. 6f).

####  IV.1.2 Effect of the fan loads and hatch position on the downwind
barometer

In this section, we provide models describing the effect of the fan loads and
hatch position on the static pressure inside the wind tunnel, corresponding to
the measurement $\tilde{P}_{\text{dw}}$ of the downwind barometer. Models
C1–C3 relate the pressure to the fan speeds $\omega_{\text{in}}$ and hatch
position $H$. We can combine them with models A1 or A2 of the fan speeds to
simulate the barometer reading as a function of the fan loads
($L_{\text{in}},L_{\text{out}}$), as we do in Fig. 6f.

To model the complex dynamics of the airflow through the wind tunnel, models
C1–C3 make some simplifying assumptions. In first place, we assume that the
change in static pressure can be simply computed as the difference of the
static pressure produced by each fan. Furthermore, we model each fan
independently, ignoring mutual effects between them.

##### Model C1

As a first approach, we model the static pressure $P_{\text{dw}}$ inside the
tunnel as

$\displaystyle
P_{\text{dw}}=P_{\text{amb}}+S_{\text{max}}\left(\frac{\omega_{\text{in}}}{\omega_{\text{max}}}\right)^{2}-S_{\text{max}}\left(\frac{\omega_{\text{out}}}{\omega_{\text{max}}}\right)^{2},$
(5)

where $P_{\text{amb}}$ is the static pressure outside the wind tunnel
(corresponding to the barometer reading $\tilde{P}_{\text{amb}}$). The other
two terms on the RHS correspond to the static pressures produced by the intake
and exhaust fans, resulting from the the affinity laws [[, e.g., ]chapter
5.14]leckner2008ludwig. The parameters of our model are
$\Theta:=(S_{\text{max}},\omega_{\text{max}})$, corresponding to the maximum
static pressure and maximum speed of the fan. From the technical
specifications, we can set these values to $74.82$ Pa and $314.16\text{
rad}/\text{s}$, respectively.

##### Model C2

Model C1 assumes that the fans always produce their maximum static pressure
$S_{\text{max}}\left(\frac{\omega}{\omega_{\text{max}}}\right)^{2}$ at a given
speed $\omega$. In reality, there is a trade-off between the airflow and
static pressure produced by the fan, dictated by the system’s resistance to
the flow of air, which is called _impedance_. As an illustration, a fan
blowing into an enclosure with no other openings produces no airflow but
maximum static pressure, whereas a fan at the boundary of two completely open
enclosures produces its maximum airflow but no static pressure [49]. To
account for this effect, we model the pressure $P$ as

$P_{\text{dw}}=P_{\text{amb}}+S_{Z}(\omega_{\text{in}})-S_{Z}(\omega_{\text{out}}),$

where $S_{Z}(\omega)$ is the static pressure produced by the fan at speed
$\omega$ in a system with impedance $Z$. We compute $S_{Z}(\omega)$ as the
intersection of the impedance curve $S=ZQ^{2}$ with the pressure-airflow
characteristic (PQ-curve) of the fan at speed $\omega$ [[, see, e.g.,
]]fans2024tang. Because the PQ-curve of our fans is not available, we
approximate them as the linear relation

$S=\left(\frac{\omega_{\text{in}}}{\omega_{\text{max}}}\right)^{2}S_{\text{max}}-\left(\frac{\omega_{\text{in}}}{\omega_{\text{max}}}\right)\frac{S_{\text{max}}}{Q_{\text{max}}}Q,$

where $Q_{\text{max}}$ is the maximum airflow of the fan. The impedance
$Z\in[0,\infty]$ is a result of the complex dynamics of the air as it flows
through the wind tunnel, and we cannot directly calculate it. For a more
intuitive interpretation, we can express it in terms of the ratio $r$ of the
maximum airflow that the fans produce when turning at full speed, yielding
$Z:=\frac{S_{\text{max}}}{Q_{\text{max}}^{2}}\left(\frac{1-r}{r^{2}}\right)$
for $r\in[0,1]$. Under this parametrization, our model becomes

$\displaystyle
P_{\text{dw}}=P_{\text{amb}}+S_{r}(\omega_{\text{in}})-S_{r}(\omega_{\text{out}}),$
(6)

with parameters
$\Theta:=(S_{\text{max}},\omega_{\text{max}},Q_{\text{max}},r)$. Following the
fan’s specifications, we set the maximum airflow to
$Q_{\text{max}}=0.052\text{m}^{3}/\text{s}$. For the simulation results in
Fig. 6f, we set $r=0.7$.

##### Model C3

So far. we have not considered the effect of the hatch position ($H$) on the
pressure inside the tunnel. Building on Model C2, we model the effect of the
hatch as a change in the impedance of the system. Opening the hatch lowers the
system impedance and, thus, the static pressure produced by the fans. As in
(6), we model the pressure as

$\displaystyle
P_{\text{dw}}=P_{\text{amb}}+S_{r(H)}(\omega_{\text{in}})-S_{r(H)}(\omega_{\text{out}}),$
(7)

except now the maximum airflow ratio is given by the function
$r(H)=\min(1,r_{0}+\beta\frac{H}{45})$, where $H\in[0,45]$, $r_{0}\in[0,1]$ is
the ratio when the hatch is closed ($H=0$), and $\beta>0$ is the effect of the
hatch, which we model as linear. Thus, the parameters of the model become
$\Theta:=(S_{\text{max}},\omega_{\text{max}},Q_{\text{max}},r_{0},\beta)$. For
the simulation results in Fig. 6f, we set $r_{0}=0.7$, $\beta=0.15$, and all
other parameters as for the previous models.

####  IV.1.3 Relationship between the up- and downwind barometers

Due to their positioning, the pair of barometers inside the wind tunnel
function as a pitot tube, where the upwind barometer ($\tilde{P}_{\text{up}}$)
measures the stagnation or total pressure, and the downwind barometer
($\tilde{P}_{\text{dw}}$) measures the static pressure. Ignoring measurement
noise, the readings of both barometers can be related by Bernoulli’s
principle:

$\displaystyle\tilde{P}_{\text{up}}=\tilde{P}_{\text{dw}}+\frac{1}{2}\rho
v^{2}+\Delta.$ (8)

Above, $\rho$ is the density of the air, $v$ is the speed of the airflow and
$\Delta$ is the offset between the readings of the barometers due to
manufacturing differences, which we empirically determine to be around
$\Delta=7.1$ Pa. By solving for $v$, we can use (8) to estimate the speed of
the airflow through the tunnel. Model D1 relates the difference in the
barometer readings to the speed of the intake fan.

##### Model D1

To express the speed $v$ of the airflow as a function of the intake fan speed,
we again rely on the affinity laws, which state that the airflow $Q$ produced
by the fan is proportional to its speed $\omega_{\text{in}}$, i.e.

$Q=\left(\frac{\omega_{\text{in}}}{\omega_{\text{max}}}\right)Q_{\text{max}},$

where $\omega_{\text{max}},Q_{\text{max}}$ are the maximum speed and airflow
of the fan. Dividing by the area $A$ of the fan opening, we obtain the
following expression for air speed

$v=\frac{1}{A}\left(\frac{\omega_{\text{in}}}{\omega_{\text{max}}}\right)Q_{\text{max}}.$

Combining this with (8), we arrive at

$\displaystyle\tilde{P}_{\text{up}}-\tilde{P}_{\text{dw}}=\frac{\rho}{2A^{2}}\left(\frac{Q_{\text{max}}}{\omega_{\text{max}}}\right)^{2}\omega_{\text{in}}^{2}+\Delta,$
(9)

where $\Theta:=(\rho,A,\omega_{\text{max}},Q_{\text{max}},\Delta)$ are the
parameters of our model. Given the specifications of the fan, we have $A=\pi
0.06^{2}\text{ m}^{2}$ and $\omega_{\text{max}}=314.16\text{ rad}/\text{s}$.
We can set $\rho=1.2$ and we empirically determine $\Delta=7.1$ Pa. The same
difficulties apply to estimating $Q_{\text{max}}$ as for $S_{\text{max}}$ in
model C1. Furthermore, in this model we ignore the additional effect that the
exhaust fan has on the total airflow through the tunnel. For the symbolic
regression task in Fig. 6e, we turn off the exhaust fan and take steady-state
measurements for different loads of the intake fan (see the wt_bernoulli_v1
dataset for more details).

###  Appendix IV.2 Light Tunnel

In Sec. IV.2.1, we provide some background on Malus’ law and provide a model
of the effect of the polarizer angles ($\theta_{1},\theta_{2}$) on the light
intensity reaching the third light sensor ($\tilde{I}_{3},\tilde{V}_{3})$. In
Sec. IV.2.2 we provide models of the image-capture process with increasing
degrees of fidelity.

####  IV.2.1 Polarizer Effects

Figure 17: Comparing the prediction of model E1 (Malus’ law) with real
measurements gathered from the light tunnel. Model E1 is fit to data gathered
under different brightness settings of the light source (i.e.,
$R=G=B=64,128,255$), obtaining a coefficient of determination of
$R^{2}=0.93,0.97,0.99$, respectively. The data for $R=G=B=255$ is used in the
symbolic regression task of Fig. 6e. The signal-to-noise decreases with the
light-source brightness, allowing for more challenging scenarios. The data can
be found in the lt_malus_v1 dataset.

Depending on their angle, the linear polarizers dim the light passing through
them. Malus’ law describes their effect on light intensity [50]: given a beam
of totally polarized light and a perfect polarizer, the intensity $I$ after
the polarizer is given by $I=I_{0}\cos^{2}(\theta)$, where $I_{0}$ is the
intensity before the polarizer and $\theta$ is the angle between the polarizer
axis and the polarization of the incident light. For unpolarized light passing
through two polarizers at angles $\theta_{1}$ and $\theta_{2}$, the intensity
after the polarizers becomes

$I=\frac{1}{2}I_{0}\cos^{2}(\theta_{1}-\theta_{2}).$

In practice, polarizers are imperfect: they are not fully transparent to light
polarized parallel to their polarization axis, and they do not block all light
with polarization orthogonal to it. Furthermore, their effect depends on the
frequency of light. For an unpolarized light beam with a given spectral
composition, a pair of polarizers will scale its intensity by $T^{p}<1/2$;
when orthogonal, they will still allow some light to pass through, scaling the
intensity by $T^{c}>0$.

##### Model E1

To model the effect of the polarizer angles $\theta_{1},\theta_{2}$ on the
intensity $I_{3}$ of light reaching the third sensor, we can reformulate the
generalization of Malus’ law for imperfect polarizers [51] in terms of the
transmission rates $T^{p},T^{c}$, resulting in the model

$I_{3}=I_{0}[(T^{p}-T^{c})\cos^{2}(\theta_{1}-\theta_{2})+T^{c}],$

where $\Theta:=(I_{0},T^{p},T^{c})$ are the parameters of the model. The
radiant intensity before the polarizers ($I_{0}$) is given in watts per
steradian (W/sr), and depends e.g., on the brightness of the tunnel light
source. For the polarizing film used in the light tunnel, values for the
transmission rates $T^{p},T^{c}\in[0,1]$ can be found in App. VI under the
polarizer component. We can rewrite the above model as

$I_{3}=\beta_{1}\cos^{2}(\theta_{1}-\theta_{2})+\beta_{0},$

becoming our ground truth for the symbolic regression task in Fig. 6e. We
compare, in Fig. 17 the output of model E1 to measurements gathered from the
chamber, with the parameters $\beta_{0},\beta_{1}$ fit to the data.

####  IV.2.2 Image Capture

As models of the image-capture process in the light tunnel, we provide simple
simulators that produce a synthetic image given the light-source setting
$R,G,B$ and polarizer angles $\theta_{1},\theta_{2}$. The resulting image
simulates the image ($\tilde{\text{I}}$m) produced by the light tunnel and
consists of a hexagon over a black background, whose color is given by the RGB
vector $(\tilde{R},\tilde{G},\tilde{B})\in[0,1]^{3}$ and models the response
of the camera sensor. The models F1–F3 differ in how the vector
$(\tilde{R},\tilde{G},\tilde{B})$ is computed. In Fig. 6f, we compare their
output to real images produced by the light tunnel.

##### Model F1

The first model assumes the linear polarizers to be perfect and that their
effect is uniform across all wavelengths. Furthermore, it assumes that the
camera sensor is perfectly calibrated to the light source. The resulting color
vector is given by

$\displaystyle\begin{pmatrix}\tilde{R}\\\ \tilde{G}\\\ \tilde{B}\\\
\end{pmatrix}=\cos^{2}(\theta_{1}-\theta_{2})\frac{1}{255}\begin{pmatrix}R\\\
G\\\ B\\\ \end{pmatrix},$ (10)

where $\cos^{2}(\theta_{1}-\theta_{2})$ models the dimming effect of the
polarizers according to Malus’ law (see Sec. IV.2.1 above).

##### Model F2

The second model explicitly models the output of the camera sensor as a result
of its spectral sensitivity and the white balance correction applied by the
processor in the camera. Our complete model is

$\displaystyle\begin{pmatrix}\tilde{R}\\\ \tilde{G}\\\ \tilde{B}\\\
\end{pmatrix}=\min\\{1,eWS\cos^{2}(\theta_{1}-\theta_{2})\frac{1}{255}\begin{pmatrix}R\\\
G\\\ B\\\ \end{pmatrix}\\},$ (11)

where

  * •

$S\in\mathbb{R}^{3\times 3}_{+}$ models the response of the sensor to the
light of each color,

  * •

$W:=\textnormal{diag}\left(w_{R},w_{B},w_{C}\right)$ with
$w_{R},w_{B},w_{C}\in\mathbb{R}_{+}:w_{R}+w_{B}+w_{C}=1$ is the white-balance
correction applied by the camera, and

  * •

$e>0$ is an additional parameter to model the exposure of the sensor as
affected by the camera parameters aperture (Ap), shutter speed
($T_{\text{Im}}$), and sensor gain (ISO).

The term $\min\\{1,x\\}:=(\min\\{1,x_{i}\\})_{i=1,2,3}$ truncates the
resulting color vector to the interval $[0,1]^{3}$, modeling overexposure of
the camera sensor.

##### Model F3

We separately model the effect of the polarizers on each of the frequencies
produced by the light source. Our model becomes

$\displaystyle\begin{pmatrix}\tilde{R}\\\ \tilde{G}\\\ \tilde{B}\\\
\end{pmatrix}=\min\\{1,eWS\textnormal{diag}\left((T^{p}-T^{c})\cos^{2}(\theta_{1}-\theta_{2})+T^{c}\right)\frac{1}{255}\begin{pmatrix}R\\\
G\\\ B\\\ \end{pmatrix}\\},$ (12)

where $T^{p}:=(T^{p}_{R},T^{p}_{G},T^{p}_{B})\in[0,1]^{3}$ are the
transmission rates for each color when the polarizers are aligned, and
$T^{c}\in[0,1]^{3}$ when their polarization axes are perpendicular. From the
technical specifications of the light source and polarizers, appropriate
values are $T^{p}=(0.29,0.35,0.33)$ and $T^{c}=(0.02,0.08,0.18)$; for the
corresponding datasheets, see the light_source and polarizer components in
Table 9.

##  Appendix V Causal Ground Truth

In this appendix, we formalize a causal interpretation of the ground-truth
graphs in Fig. 3. Equipped with this interpretation, which we give in
Definition 1, the graphs describe constraints on the underlying causal system.
We also provide a procedure to empirically validate these constraints using
data collected from the chambers.

In Sec. 2, we categorized the variables in each ground-truth graph $G$ as
_non-manipulable_ variables, corresponding to sensor measurements, and
_manipulable_ variables, that is, actuators and sensor parameters. Here, we
further split the latter into manipulable variables with no incoming edges in
$G$, which we call _exogenous_ , and manipulable variables with incoming
edges, which we call _endogenous_ and are set by the control computer as a
function of the other variables in the system. We refer to such functions as
_assignment functions_.

Let $X_{V}=(X_{1},\ldots,X_{k})$ denote a vector of chamber variables and let
us assume that there is a true causal model describing the system; more
formally, we denote by
$P(X_{j}^{t}\mid\operatorname{do}(X^{t_{0}}_{V\setminus\\{j\\}}=x))$ the
distribution of variable $X_{j}$ at time $t$, after performing an intervention
on all other chamber variables $X_{V\setminus\\{j\\}}$ at some earlier time
$t_{0}<t$. We can sample from this distribution by taking a measurement from
the chamber, where the intervention corresponds to the following manipulations
of its variables: if $X_{i}$ is a non-manipulable variable, i.e., a sensor
measurement, the intervention consists of overwriting its value with $x_{i}$.
If $X_{k}\in X_{V\setminus\\{j\\}}$ is an exogenous manipulable variable, then
the intervention corresponds to setting it to $x_{k}$. If it is an endogenous
manipulable variable, the intervention also sets its value to $x_{k}$,
overriding the value set by its assignment function.

######  Definition 1 (Ground-truth causal model).

Let $G$ be a directed graph over $X_{V}$. We call $G$ a _ground-truth graph_
if an edge $X_{i}\to X_{j}$ in $G$ implies that

$\displaystyle\exists t,T>0,x^{A},x^{B}\text{ with }x^{A}_{i}\neq
x^{B}_{i}\text{ and }x^{A}_{k}=x^{B}_{k}\text{ for all }k\neq i,$
$\displaystyle\text{such that
}P(X_{j}^{t+T}\mid\operatorname{do}(X_{V\setminus\\{j\\}}^{t}=x^{A}))\neq
P(X_{j}^{t+T}\mid\operatorname{do}(X_{V\setminus\\{j\\}}^{t}=x^{B})).$ (13)

Although it is impossible to directly evaluate (1)—we would need to perform
two different interventions simultaneously—Definition 1 allows us, under
additional assumptions, to make statements about what a ground-truth graph $G$
implies for the observations collected from the chambers. For example, if we
assume that the distribution resulting from an intervention depends on the
time lag (but not the absolute time $t$) at which the intervention is
performed (the assumption is formalized in Proposition 1 below), then we can
use two-sample tests for testing (1). This assumption is suitable for the
controlled environment of the light tunnel and for many of the effects in the
wind tunnel. For the effects on the barometric measurements
($\tilde{P}_{\text{up}},\tilde{P}_{\text{dw}},\tilde{P}_{\text{amb}},\tilde{P}_{\text{int}})$,
whose distribution changes with time due to shifts in atmospheric pressure,
the assumption is still reasonable for measurements taken closely in time.

###  Appendix V.1 Empirical validation

According to Definition 1, to validate an effect $X_{i}\to X_{j}$, we would
need to reject the null hypothesis

$\displaystyle H_{0}:$ $\displaystyle\forall t,T>0,x^{A},x^{B}\text{ with
}x^{A}_{i}\neq x^{B}_{i}\text{ and }x^{A}_{k}=x^{B}_{k}\text{ for }k\neq i,$
$\displaystyle\text{such that
}P(X_{j}^{t+T}\mid\operatorname{do}(X_{V\setminus\\{j\\}}^{t}=x^{A}))=P(X_{j}^{t+T}\mid\operatorname{do}(X_{V\setminus\\{j\\}}^{t}=x^{B})).$
(14)

However, as discussed after Definition 1, additional assumptions are needed to
test $H_{0}$, since we cannot perform the two different interventions
$\operatorname{do}(X_{V\setminus\\{j\\}}^{t}=x^{A})$ and
$\operatorname{do}(X_{V\setminus\\{j\\}}^{t}=x^{B})$ at the same time $t$. We
first state our validation procedure and then provide sufficient conditions
for it to have the appropriate level for testing $H_{0}$.

###### Validation procedure

Pick predefined $x_{A},x_{B},T,N,\alpha$.

  1. 1.

sample $U^{1},\ldots,U^{N}$ i.i.d. from a Bernoulli distribution with $p=0.5$

  2. 2.

sample $\Delta t_{1},\ldots,\Delta t_{N}\text{
i.i.d.}\sim\text{Unif}[10^{-3},1]$

  3. 3.

let $t_{0}+T$ be the current time

  4. 4.

for $n=1,\ldots,N$

    1. (a)

wait $\Delta t_{n}$ seconds

    2. (b)

(at time $t_{n}:=t_{n-1}+T+\Delta t_{n}$) set $X_{V\setminus\\{j\\}}\leftarrow
x^{A}$ if $U^{n}=0$, or $X_{V\setminus\\{j\\}}\leftarrow x^{B}$ otherwise

    3. (c)

wait $T$ seconds

    4. (d)

(at time $t_{n}+T$) collect the measurement $x^{t_{n}+T}$ from the chamber

    5. (e)

add the measurement of $X_{j}$ to the sample
$\bm{X}^{A}\leftarrow\bm{X}^{A}\cup\\{x_{j}^{t_{n}+T}\\}$ if $U^{n}=0$, and
$\bm{X}^{B}\leftarrow\bm{X}^{B}\cup\\{x_{j}^{t_{n}+T}\\}$ otherwise

  5. 5.

perform a two-sample test $\psi$ that is level $\alpha$ (in practice, we use a
Kolmogorov-Smirnov [52] test), comparing the samples $\bm{X}^{A}$ and
$\bm{X}^{B}$, resulting in a p-value $p$

  6. 6.

reject $H_{0}$ if $p\leq\alpha$

The above procedure amounts to a randomized controlled trial, where the
treatment units are the $N$ measurements, and both the intervention
allocations and intervention times are randomized. Proposition 1 provides
sufficient conditions for the procedure to achieve the correct level in
testing $H_{0}$ (V.1).

######  Proposition 1.

Let $x_{A},x_{B},T,N,\alpha$ be the values used in the validation procedure
and assume that the following two assumptions hold.

  1. _A1._

For all $t_{1},\ldots,t_{N}$ such that $t_{i}+T<t_{i+1}$ for all
$i\in\\{1,\ldots,N-1\\}$, and for all
$x^{1},\ldots,x^{N}\in\\{x_{A},x_{B}\\}$, it holds that for all
$n\in\\{1,\ldots,N\\}$

$P(X_{j}^{t_{n}+T}\mid\operatorname{do}(X_{V\setminus\\{j\\}}^{t_{n}}=x^{n}),\ldots,\operatorname{do}(X_{V\setminus\\{j\\}}^{t_{1}}=x^{1}),X_{j}^{t_{n-1}+T},\ldots,X_{j}^{t_{1}+T})=P(X_{j}^{t_{n}+T}\mid\operatorname{do}(X_{V\setminus\\{j\\}}^{t_{n}}=x^{n})).$

  2. _A2._

$\forall\tau,t$

$P(X_{j}^{t+T}\mid\operatorname{do}(X_{V\setminus\\{j\\}}^{t}=x_{A}))=P(X_{j}^{t+T+\tau}\mid\operatorname{do}(X_{V\setminus\\{j\\}}^{t+\tau}=x_{A})),$

and

$P(X_{j}^{t+T}\mid\operatorname{do}(X_{V\setminus\\{j\\}}^{t}=x_{B}))=P(X_{j}^{t+T+\tau}\mid\operatorname{do}(X_{V\setminus\\{j\\}}^{t+\tau}=x_{B})).$

Then, the validation procedure is level $\alpha$ for testing $H_{0}$.

###### Proof.

Assumptions A1 and A2 imply that there is $P^{A}$ and $P^{B}$ such that,
conditioned on the realizations of $U_{1},\ldots,U_{N}$,
$\bm{X}^{A}\sim\text{i.i.d. }P^{A}$, and $\bm{X}^{B}\sim\text{i.i.d. }P^{B}$.
Additionally, under $H_{0}$, $P^{A}=P^{B}$. Thus,
$P(\psi(\bm{X}^{A},\bm{X}^{B})=1)\leq\alpha$. ∎

In essence, assumptions _A1_ and _A2_ ensure that the test in step 5 of the
procedure receives two samples composed of independent and identically
distributed observations. Alternative tests requiring weaker conditions may be
possible. In any case, the assumptions are not unreasonable for the causal
chambers. Both assumptions hold when $X_{j}$ is an endogenous manipulable
variable, and they are reasonable for all sensor measurements in the light
tunnel, and most in the wind tunnel. An exception comes from the barometric
measurements
$\tilde{P}_{\text{dw}},\tilde{P}_{\text{up}},\tilde{P}_{\text{amb}}$ and
$\tilde{P}_{\text{int}}$, which are affected by the atmospheric pressure
outside the chamber. In this case, assumption _A2_ may not hold for large
$\tau$. However, the issue is largely reduced for measurements taken very
closely in time. Furthermore, the randomization of time points and
intervention assignments provides some robustness against violations of A1 and
A2.

The results of the procedure, in the form of the p-values computed in step 5
(using the Kolmogorov-Smirnov two-sample test), are shown for each edge and
ground-truth graph in Table 5-Table 8. The corresponding datasets are listed
in the caption of each table, and the code to compute the p-values can be
found in the Jupyter notebook causal_validation.ipynb in the paper repository
at github.com/juangamella/causal-chamber-paper. The data from some experiments
was used to compute the p-values for different edges and some experiments have
been repeated a few times; in Table 5-Table 8 we show the raw p-values
produced by the test without additional corrections for multiple testing.

Edge | p-value | Edge | p-value | Edge | p-value | Edge | p-value
---|---|---|---|---|---|---|---
$R\to\tilde{I}_{1}$ | $2.3\times 10^{-14}\quad$ | $G\to\tilde{I}_{1}$ | $1.6\times 10^{-14}\quad$ | $B\to\tilde{I}_{1}$ | $1.8\times 10^{-14}\quad$ | $R\to\tilde{I}_{2}$ | $2.3\times 10^{-14}\quad$
$G\to\tilde{I}_{2}$ | $1.6\times 10^{-14}\quad$ | $B\to\tilde{I}_{2}$ | $1.8\times 10^{-14}\quad$ | $R\to\tilde{I}_{3}$ | $2.3\times 10^{-14}\quad$ | $G\to\tilde{I}_{3}$ | $1.6\times 10^{-14}\quad$
$B\to\tilde{I}_{3}$ | $1.8\times 10^{-14}\quad$ | $R\to\tilde{V}_{1}$ | $2.3\times 10^{-14}\quad$ | $G\to\tilde{V}_{1}$ | $1.6\times 10^{-14}\quad$ | $B\to\tilde{V}_{1}$ | $1.8\times 10^{-14}\quad$
$R\to\tilde{V}_{2}$ | $2.3\times 10^{-14}\quad$ | $G\to\tilde{V}_{2}$ | $1.6\times 10^{-14}\quad$ | $B\to\tilde{V}_{2}$ | $1.8\times 10^{-14}\quad$ | $R\to\tilde{V}_{3}$ | $2.3\times 10^{-14}\quad$
$G\to\tilde{V}_{3}$ | $1.6\times 10^{-14}\quad$ | $B\to\tilde{V}_{3}$ | $1.8\times 10^{-14}\quad$ | $R\to\tilde{C}$ | $2.3\times 10^{-14}\quad$ | $G\to\tilde{C}$ | $1.6\times 10^{-14}\quad$
$B\to\tilde{C}$ | $1.8\times 10^{-14}\quad$ | $\theta_{1}\to\tilde{I}_{3}$ | $2.9\times 10^{-14}\quad$ | $\theta_{2}\to\tilde{I}_{3}$ | $6.6\times 10^{-14}\quad$ | $\theta_{1}\to\tilde{V}_{3}$ | $2.9\times 10^{-14}\quad$
$\theta_{2}\to\tilde{V}_{3}$ | $6.6\times 10^{-14}\quad$ | $\theta_{1}\to\tilde{\theta}_{1}$ | $2.9\times 10^{-14}\quad$ | $\theta_{2}\to\tilde{\theta}_{2}$ | $6.6\times 10^{-14}\quad$ | $R_{1}\to\tilde{\theta}_{1}$ | $1.6\times 10^{-14}\quad$
$O_{1}\to\tilde{\theta}_{1}$ | $3.6\times 10^{-104}\quad$ | $R_{2}\to\tilde{\theta}_{2}$ | $2.3\times 10^{-14}\quad$ | $O_{2}\to\tilde{\theta}_{2}$ | $4.4\times 10^{-16}\quad$ | $R_{C}\to\tilde{C}$ | $1.8\times 10^{-14}\quad$
$O_{C}\to\tilde{C}$ | $4.1\times 10^{-24}\quad$ | $L_{11}\to\tilde{I}_{1}$ | $1.6\times 10^{-14}\quad$ | $L_{12}\to\tilde{I}_{1}$ | $2.3\times 10^{-14}\quad$ | $L_{11}\to\tilde{V}_{1}$ | $1.6\times 10^{-14}\quad$
$L_{12}\to\tilde{V}_{1}$ | $2.3\times 10^{-14}\quad$ | $T^{I}_{1}\to\tilde{I}_{1}$ | $1.8\times 10^{-14}\quad$ | $D^{I}_{1}\to\tilde{I}_{1}$ | $2.9\times 10^{-14}\quad$ | $T^{V}_{1}\to\tilde{V}_{1}$ | $1.8\times 10^{-14}\quad$
$D^{V}_{1}\to\tilde{V}_{1}$ | $1.8\times 10^{-14}\quad$ | $L_{21}\to\tilde{I}_{2}$ | $4.2\times 10^{-14}\quad$ | $L_{22}\to\tilde{I}_{2}$ | $6.6\times 10^{-14}\quad$ | $L_{21}\to\tilde{V}_{2}$ | $4.2\times 10^{-14}\quad$
$L_{22}\to\tilde{V}_{2}$ | $1.3\times 10^{-12}\quad$ | $T^{I}_{2}\to\tilde{I}_{2}$ | $1.8\times 10^{-14}\quad$ | $D^{I}_{2}\to\tilde{I}_{2}$ | $1.6\times 10^{-14}\quad$ | $T^{V}_{2}\to\tilde{V}_{2}$ | $1.6\times 10^{-14}\quad$
$D^{V}_{2}\to\tilde{V}_{2}$ | $8.9\times 10^{-13}\quad$ | $L_{31}\to\tilde{I}_{3}$ | $2.3\times 10^{-14}\quad$ | $L_{32}\to\tilde{I}_{3}$ | $4.2\times 10^{-14}\quad$ | $L_{31}\to\tilde{V}_{3}$ | $6.8\times 10^{-12}\quad$
$L_{32}\to\tilde{V}_{3}$ | $4.2\times 10^{-14}\quad$ | $T^{I}_{3}\to\tilde{I}_{3}$ | $2.3\times 10^{-14}\quad$ | $D^{I}_{3}\to\tilde{I}_{3}$ | $4.2\times 10^{-14}\quad$ | $T^{V}_{3}\to\tilde{V}_{3}$ | $1.8\times 10^{-14}\quad$
$D^{V}_{3}\to\tilde{V}_{3}$ | $2.3\times 10^{-14}\quad$ |  |  |  |  |  |
Table 5: Results of the validation procedure for the edges of the standard-configuration graph of the light tunnel (Fig. 3a). For each edge, we show the p-value resulting from the Kolmogorov-Smirnov [52] test computed in step 5 of the procedure. All p-values are below $10^{-11}$. The experimental data, together with the interventions $x^{A},x^{B}$, waiting time $T$ and sample size $N$ for each edge can be found in the lt_validate_v1 dataset at causalchamber.org. Edge | p-value | Edge | p-value | Edge | p-value
---|---|---|---|---|---
$L_{\text{in}}\to\tilde{\omega}_{\text{in}}$ | $1.6\times 10^{-14}\quad$ | $T_{\text{in}}\to\tilde{\omega}_{\text{in}}$ | $3.3\times 10^{-16}\quad$ | $L_{\text{in}}\to\tilde{\omega}_{\text{out}}$ | $1.6\times 10^{-14}\quad$
$L_{\text{in}}\to\tilde{C}_{\text{in}}$ | $1.6\times 10^{-14}\quad$ | $L_{\text{in}}\to\tilde{C}_{\text{out}}$ | $1.9\times 10^{-27}\quad$ | $L_{\text{out}}\to\tilde{\omega}_{\text{in}}$ | $3.4\times 10^{-14}\quad$
$L_{\text{out}}\to\tilde{\omega}_{\text{out}}$ | $3.4\times 10^{-14}\quad$ | $T_{\text{out}}\to\tilde{\omega}_{\text{out}}$ | $1.3\times 10^{-127}\quad$ | $L_{\text{out}}\to\tilde{C}_{\text{out}}$ | $3.4\times 10^{-14}\quad$
$L_{\text{out}}\to\tilde{C}_{\text{in}}$ | $1.1\times 10^{-8}\quad$ | $H\to\tilde{\omega}_{\text{in}}$ | $1.1\times 10^{-16}\quad$ | $H\to\tilde{\omega}_{\text{out}}$ | $1.1\times 10^{-16}\quad$
$L_{\text{in}}\to\tilde{P}_{\text{int}}$ | $2.5\times 10^{-7}\quad$ | $H\to\tilde{P}_{\text{int}}$ | $8.8\times 10^{-11}\quad$ | $L_{\text{out}}\to\tilde{P}_{\text{int}}$ | $0.082\quad$
$O_{\text{int}}\to\tilde{P}_{\text{int}}$ | $8.1\times 10^{-25}\quad$ | $L_{\text{in}}\to\tilde{P}_{\text{up}}$ | $1.6\times 10^{-14}\quad$ | $H\to\tilde{P}_{\text{up}}$ | $2.9\times 10^{-14}\quad$
$L_{\text{out}}\to\tilde{P}_{\text{up}}$ | $3.4\times 10^{-14}\quad$ | $O_{\text{up}}\to\tilde{P}_{\text{up}}$ | $8\times 10^{-7}\quad$ | $L_{\text{in}}\to\tilde{P}_{\text{dw}}$ | $1.6\times 10^{-14}\quad$
$H\to\tilde{P}_{\text{dw}}$ | $2.9\times 10^{-14}\quad$ | $L_{\text{out}}\to\tilde{P}_{\text{dw}}$ | $3.4\times 10^{-14}\quad$ | $O_{\text{dw}}\to\tilde{P}_{\text{dw}}$ | $1.7\times 10^{-5}\quad$
$O_{\text{amb}}\to\tilde{P}_{\text{amb}}$ | $2.1\times 10^{-287}\quad$ | $O_{\text{in}}\to\tilde{C}_{\text{in}}$ | $7.3\times 10^{-22}\quad$ | $R_{\text{in}}\to\tilde{C}_{\text{in}}$ | $0\quad$
$O_{\text{out}}\to\tilde{C}_{\text{out}}$ | $7.8\times 10^{-16}\quad$ | $R_{\text{out}}\to\tilde{C}_{\text{out}}$ | $3.3\times 10^{-16}\quad$ | $A_{1}\to\tilde{S}_{1}$ | $4.4\times 10^{-16}\quad$
$O_{1}\to\tilde{S}_{1}$ | $5.6\times 10^{-16}\quad$ | $R_{1}\to\tilde{S}_{1}$ | $0\quad$ | $A_{1}\to\tilde{S}_{2}$ | $4.4\times 10^{-16}\quad$
$A_{2}\to\tilde{S}_{2}$ | $2.2\times 10^{-59}\quad$ | $O_{2}\to\tilde{S}_{2}$ | $1.8\times 10^{-35}\quad$ | $R_{2}\to\tilde{S}_{2}$ | $0\quad$
$A_{1}\to\tilde{M}$ | $4.5\times 10^{-9}\quad$ | $L_{\text{in}}\to\tilde{M}$ | $1.8\times 10^{-9}\quad$ | $L_{\text{out}}\to\tilde{M}$ | $2.7\times 10^{-7}\quad$
$H\to\tilde{M}$ | $3.4\times 10^{-15}\quad$ | $O_{M}\to\tilde{M}$ | $1.1\times 10^{-16}\quad$ | $R_{M}\to\tilde{M}$ | $0\quad$