<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Advanced
Step1:  And we'll attach some dummy datasets.  See Datasets for more details.
Step2:  Available Backends
See the Compute Tutorial for details on adding compute options and using them to create synthetic models.
The following list in any version of PHOEBE can always be accessed via phoebe.list_available_computes.
Note also that all of these are listed on the backends page and their available functionality is compared in the compute backend comparison table.
Step3:  PHOEBE 1.0 Legacy
For more details, see Comparing PHOEBE 2.0 vs PHOEBE Legacy and the legacy compute API docs.
Step4:  ellc
For more details, see the the ellc compute API docs.
Step5:  jktebop
For more details, see the the jktebop compute API docs.
Step6:  Using Alternate Backends
Adding Compute Options
Adding a set of compute options, via b.add_compute for an alternate backend is just as easy as for the PHOEBE backend.  Simply provide the function or name of the function in phoebe.parameters.compute that points to the parameters for that backend.
Here we'll add the default PHOEBE backend as well as the PHOEBE 1.0 (legacy) backend.  Note that in order to use an alternate backend, that backend must be installed on your machine.
Step7:  Running Compute
Nothing changes when calling b.run_compute - simply provide the compute tag for those options.  Do note, however, that not all backends support all dataset types.
But, since the legacy backend doesn't support ck2004 atmospheres and interpolated limb-darkening, we do need to choose a limb-darkening law.  We can do this for all passband-component combinations by using set_value_all.
For more information on limb-darkening options, see the limb-darkening tutorial.
Step8:  Running Multiple Backends Simultaneously
Running multiple backends simultaneously is just as simple as running the PHOEBE backend with multiple sets of compute options (see Compute).
We just need to make sure that each dataset is only enabled for one (or none) of the backends that we want to use, and then send a list of the compute tags to run_compute.  Here we'll use the PHOEBE backend to compute orbits and the legacy backend to compute light curves.
Step9:  The parameters inside the returned model even remember which set of compute options (and therefore, in this case, which backend) were used to compute them.
<ASSISTANT_TASK:>
Python Code:
#!pip install -I "phoebe>=2.3,<2.4"
import phoebe
from phoebe import u # units
logger = phoebe.logger()
b = phoebe.default_binary()
Explanation: Advanced: Alternate Backends
Setup
Let's first make sure we have the latest version of PHOEBE 2.3 installed (uncomment this line if running in an online notebook session such as colab).
End of explanation
b.add_dataset('orb', 
              compute_times=phoebe.linspace(0,10,1000), 
              dataset='orb01')
b.add_dataset('lc', 
              compute_times=phoebe.linspace(0,10,1000), 
              dataset='lc01')
Explanation: And we'll attach some dummy datasets.  See Datasets for more details.
End of explanation
phoebe.list_available_computes()
Explanation: Available Backends
See the Compute Tutorial for details on adding compute options and using them to create synthetic models.
The following list in any version of PHOEBE can always be accessed via phoebe.list_available_computes.
Note also that all of these are listed on the backends page and their available functionality is compared in the compute backend comparison table.
End of explanation
b.add_compute('legacy', compute='legacybackend')
print(b.get_compute('legacybackend'))
Explanation: PHOEBE 1.0 Legacy
For more details, see Comparing PHOEBE 2.0 vs PHOEBE Legacy and the legacy compute API docs.
End of explanation
b.add_compute('ellc', compute='ellcbackend')
print(b.get_compute('ellcbackend'))
Explanation: ellc
For more details, see the the ellc compute API docs.
End of explanation
b.add_compute('jktebop', compute='jktebopcompute')
print(b.get_compute('jktebopcompute'))
Explanation: jktebop
For more details, see the the jktebop compute API docs.
End of explanation
b.add_compute('phoebe', compute='phoebebackend')
print(b.get_compute('phoebebackend'))
Explanation: Using Alternate Backends
Adding Compute Options
Adding a set of compute options, via b.add_compute for an alternate backend is just as easy as for the PHOEBE backend.  Simply provide the function or name of the function in phoebe.parameters.compute that points to the parameters for that backend.
Here we'll add the default PHOEBE backend as well as the PHOEBE 1.0 (legacy) backend.  Note that in order to use an alternate backend, that backend must be installed on your machine.
End of explanation
b.set_value_all(qualifier='ld_mode', value='manual')
b.set_value_all(qualifier='ld_func', value='logarithmic')
b.run_compute('legacybackend', model='legacyresults')
Explanation: Running Compute
Nothing changes when calling b.run_compute - simply provide the compute tag for those options.  Do note, however, that not all backends support all dataset types.
But, since the legacy backend doesn't support ck2004 atmospheres and interpolated limb-darkening, we do need to choose a limb-darkening law.  We can do this for all passband-component combinations by using set_value_all.
For more information on limb-darkening options, see the limb-darkening tutorial.
End of explanation
b.set_value_all(qualifier='enabled', dataset='lc01', compute='phoebebackend', value=False)
#b.set_value_all(qualifier='enabled', dataset='orb01', compute='legacybackend', value=False)  # don't need this since legacy NEVER computes orbits
print(b.filter(qualifier='enabled'))
b.run_compute(['phoebebackend', 'legacybackend'], model='mixedresults')
Explanation: Running Multiple Backends Simultaneously
Running multiple backends simultaneously is just as simple as running the PHOEBE backend with multiple sets of compute options (see Compute).
We just need to make sure that each dataset is only enabled for one (or none) of the backends that we want to use, and then send a list of the compute tags to run_compute.  Here we'll use the PHOEBE backend to compute orbits and the legacy backend to compute light curves.
End of explanation
print(b.filter(model='mixedresults').computes)
b.filter(model='mixedresults', compute='phoebebackend').datasets
b.filter(model='mixedresults', compute='legacybackend').datasets
Explanation: The parameters inside the returned model even remember which set of compute options (and therefore, in this case, which backend) were used to compute them.
End of explanation
<END_TASK>