@@ -8,8 +8,8 @@ Manager, Workers, Generators, and Simulators
88 libEnsemble's **manager ** allocates work to **workers **,
99which perform computations via **generators ** and **simulators **:
1010
11- * :ref: `generator<api_gen_f> `: Generates inputs to the *simulator *
12- * :ref: `simulator<api_sim_f> `: Performs an evaluation based on parameters from the *generator *
11+ * :ref: `generator<api_gen_f> `: Generates inputs for the *simulator *
12+ * :ref: `simulator<api_sim_f> `: Performs an evaluation using parameters from the *generator *
1313
1414.. figure :: images/adaptiveloop.png
1515 :alt: Adaptive loops
@@ -28,19 +28,19 @@ which perform computations via **generators** and **simulators**:
2828An :doc: `executor<executor/overview> ` interface is available so generators and simulators
2929can launch and monitor external applications.
3030
31- libEnsemble uses a NumPy structured array known as the :ref: `history array<funcguides-history> `
32- to keep a record of all simulations and generated values.
31+ libEnsemble uses a NumPy structured array called the :ref: `history array<funcguides-history> `
32+ to record all simulations and generated values.
3333
3434Allocator Function
3535~~~~~~~~~~~~~~~~~~
3636
3737* :ref: `allocator<api_alloc_f> `: Decides whether a simulator or generator should be
38- prompted (and with what inputs/resources) as workers become available
38+ invoked (and with what inputs/resources) as workers become available
3939
40- The default allocator (``alloc_f ``) prompts workers to run the highest priority simulator work.
41- If a worker is idle and there is no simulator work, that worker is prompted to query the generator.
40+ The default allocator (``alloc_f ``) prompts workers to run the highest- priority simulator work.
41+ If a worker is idle and no simulator work is available , that worker is prompted to query the generator.
4242
43- The default allocator is appropriate for the vast majority of use- cases, but is customizable
43+ The default allocator is appropriate for the majority of use cases but can be customized
4444for users interested in more advanced allocation strategies.
4545
4646Example Use Cases
@@ -53,104 +53,102 @@ to support):
5353.. dropdown :: **Click Here for Use-Cases**
5454
5555 * A user wants to optimize a simulation calculation. The simulation may
56- already be using parallel resources but not a large fraction of some
57- computer. libEnsemble can coordinate the concurrent evaluation of the
58- simulation ``sim_f `` at various parameter values based on candidate parameter
59- values from ``gen_f `` (possibly after each ``sim_f `` output).
56+ already be using parallel resources but not a large fraction of a
57+ computer. libEnsemble can coordinate concurrent evaluations of the
58+ simulation ``sim_f `` at multiple parameter values based on candidate parameter
59+ values produced by ``gen_f `` (possibly after each ``sim_f `` output).
6060
6161 * A user has a ``gen_f `` that produces meshes for a
62- ``sim_f ``. Given the ``sim_f `` output, the ``gen_f `` can refine a mesh or
63- produce a new mesh. libEnsemble can ensure that the calculated meshes can be
64- used by multiple simulations without requiring moving data.
62+ ``sim_f ``. Based on the ``sim_f `` output, the ``gen_f `` can refine a mesh or
63+ produce a new mesh. libEnsemble ensures that generated meshes can be
64+ reused by multiple simulations without requiring data movement .
6565
6666 * A user wants to evaluate a simulation ``sim_f `` with different sets of
6767 parameters, each drawn from a set of possible values. Some parameter values
6868 are known to cause the simulation to fail. libEnsemble can stop
6969 unresponsive evaluations and recover computational resources for future
70- evaluations. The ``gen_f `` can possibly update the sampling after discovering
70+ evaluations. The ``gen_f `` can update the sampling strategy after discovering
7171 regions where evaluations of ``sim_f `` fail.
7272
7373 * A user has a simulation ``sim_f `` that requires calculating multiple
7474 expensive quantities, some of which depend on other quantities. The ``sim_f ``
75- can observe intermediate quantities to stop related calculations and
75+ can monitor intermediate quantities to stop related calculations early and
7676 preempt future calculations associated with poor parameter values.
7777
78- * A user has a ``sim_f `` with multiple fidelities, with the higher-fidelity
79- evaluations requiring more computational resources, and a
80- `` gen_f ``/`` alloc_f `` that decides which parameters should be evaluated and
81- at what fidelity level. libEnsemble can coordinate these evaluations without
82- requiring the user to know parallel programming .
78+ * A user has a ``sim_f `` with multiple fidelities, where higher-fidelity
79+ evaluations require more computational resources. A `` gen_f ``/`` alloc_f ``
80+ pair decides which parameters should be evaluated and
81+ at what fidelity level. libEnsemble coordinates these evaluations without
82+ requiring the user to write parallel code .
8383
84- * A user wishes to identify multiple local optima for a ``sim_f ``. Furthermore ,
84+ * A user wishes to identify multiple local optima for a ``sim_f ``. In addition ,
8585 sensitivity analysis is desired at each identified optimum. libEnsemble can
86- use the points from the APOSMM ``gen_f `` to identify optima; and after a
87- point is ruled to be an optimum, a different ``gen_f `` can produce a
88- collection of parameters necessary for sensitivity analysis of ``sim_f ``.
86+ use points from the APOSMM ``gen_f `` to identify optima. After a point is
87+ determined to be an optimum, a different ``gen_f `` can generate the
88+ parameter sets required for sensitivity analysis of ``sim_f ``.
8989
90- Combinations of these use cases are supported as well. An example of
91- such a combination is using libEnsemble to solve an optimization problem that
92- relies on simulations that fail frequently.
90+ Combinations of these use cases are also supported. For example, libEnsemble
91+ can be used to solve optimization problems where simulations fail
92+ frequently.
9393
9494Glossary
9595~~~~~~~~
9696
9797Here we define some terms used throughout libEnsemble's code and documentation.
98- Although many of these terms seem straightforward, defining such terms assists
99- with keeping confusion to a minimum when communicating about libEnsemble and
98+ Although many of these terms seem straightforward, defining them helps reduce
99+ confusion when communicating about libEnsemble and
100100its capabilities.
101101
102102.. dropdown :: **Click Here for Glossary**
103103 :open:
104104
105- * **Manager **: Single libEnsemble process facilitating communication between
106- other processes. Within libEnsemble, the *Manager * process configures and
107- passes work to and from the workers .
105+ * **Manager **: A single libEnsemble process that facilitates communication between
106+ other processes. The *Manager * configures and distributes work to
107+ workers and collects their output .
108108
109109 * **Worker **: libEnsemble processes responsible for performing units of work,
110- which may include submitting or executing tasks. *Worker * processes run
111- generation and simulation routines, submit additional tasks for execution,
112- and return results to the manager.
110+ which may include executing tasks or submitting external jobs. Workers run
111+ generation and simulation routines and return results to the manager.
113112
114113 * **Calling Script **: libEnsemble is typically imported, parameterized, and
115114 initiated in a single Python file referred to as a *calling script *. ``sim_f ``
116- and ``gen_f `` functions are also commonly configured and parameterized here.
115+ and ``gen_f `` functions are commonly configured and parameterized here.
117116
118117 * **User function **: A generator, simulator, or allocation function. These
119- are Python functions that govern the libEnsemble workflow. They
118+ Python functions govern the libEnsemble workflow. They
120119 must conform to the libEnsemble API for each respective user function, but otherwise can
121- be created or modified by the user. libEnsemble comes with many examples of
122- each type of user function .
120+ be created or modified by the user.
121+ libEnsemble includes many examples of each type .
123122
124- * **Executor **: The executor can be used within user functions to provide a
125- simple, portable interface for running and managing user tasks (applications).
126- There are multiple executors including the base ``Executor `` and ``MPIExecutor ``.
123+ * **Executor **: The executor provides a simple, portable interface for
124+ launching and managing user tasks (applications). Multiple executors are
125+ available, including the base ``Executor `` and ``MPIExecutor ``.
127126
128- * **Submit **: Enqueue or indicate that one or more jobs or tasks need to be
129- launched. When using the libEnsemble Executor, a *submitted * task is executed
127+ * **Submit **: To enqueue or indicate that one or more jobs or tasks should be
128+ launched. When using the libEnsemble Executor, a *submitted * task is either executed
130129 immediately or queued for execution.
131130
132- * **Tasks **: Sub-processes or independent units of work. Workers perform
133- * tasks * as directed by the manager; tasks may include submitting external
131+ * **Tasks **: Subprocesses or independent units of work. Workers perform
132+ tasks as directed by the manager. Tasks may include launching external
134133 programs for execution using the Executor.
135134
136135 * **Persistent **: Typically, a worker communicates with the manager
137- before and after initiating a user ``gen_f `` or ``sim_f `` calculation. However, user
138- functions may also be constructed to communicate directly with the manager,
139- for example, to efficiently maintain and update data structures instead of
140- communicating them between manager and worker. These calculations
141- and the workers assigned to them are referred to as *persistent *.
142-
143- * **Resource Manager ** libEnsemble has a built-in resource manager that can detect
144- (or be provided with) a set of resources (e.g., a node-list). Resources are
145- divided up among workers (using *resource sets *) and can be dynamically
136+ before and after initiating a user ``gen_f `` or ``sim_f `` calculation. Persistent user
137+ functions instead communicate directly with the manager during execution,
138+ allowing them to maintain and update data structures efficiently. These
139+ calculations and their assigned workers are referred to as *persistent *.
140+
141+ * **Resource Manager **: libEnsemble includes a built-in resource manager that can detect
142+ (or be provided with) available resources (e.g., a node list). Resources are
143+ divided among workers using *resource sets * and can be dynamically
146144 reassigned.
147145
148146 * **Resource Set **: The smallest unit of resources that can be assigned (and
149- dynamically reassigned) to workers. By default it is the provisioned resources
150- divided by the number of workers (excluding any workers given in the
151- ``zero_resource_workers `` libE_specs option). However, it can also be set
152- directly by the ``num_resource_sets `` libE_specs option.
147+ dynamically reassigned) to workers. By default this is the provisioned resources
148+ divided by the number of workers (excluding any workers listed in the
149+ ``zero_resource_workers `` `` libE_specs `` option). It can also be set
150+ explicitly using the ``num_resource_sets `` `` libE_specs `` option.
153151
154- * **Slot **: The `` resource sets`` enumerated on a node (starting with zero). If
155- a resource set has more than one node, then each node is considered to have slot
152+ * **Slot **: Resource sets enumerated on a node (starting from zero). If
153+ a resource set spans multiple nodes, each node is considered to have slot
156154 zero.
0 commit comments