Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions qiskit_experiments/curve_analysis/curve_analysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -1152,6 +1152,11 @@ def _run_analysis(
# pylint: disable=assignment-from-none
quality = self._evaluate_quality(fit_data=fit_result)

fit_models = {
series_def.name: series_def.model_description or "no description"
for series_def in self.__series__
}

# overview entry
analysis_results.append(
AnalysisResultData(
Expand All @@ -1163,6 +1168,7 @@ def _run_analysis(
"popt_keys": fit_result.popt_keys,
"dof": fit_result.dof,
"covariance_mat": fit_result.pcov,
"fit_models": fit_models,
},
)
)
Expand Down
3 changes: 3 additions & 0 deletions qiskit_experiments/curve_analysis/curve_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ class SeriesDef:
# Whether to plot fit uncertainty for this line.
plot_fit_uncertainty: bool = False

# Latex description of this fit model
model_description: Optional[str] = None


@dataclasses.dataclass(frozen=True)
class CurveData:
Expand Down
2 changes: 1 addition & 1 deletion qiskit_experiments/curve_analysis/fit_function.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ def sin(
.. math::
y = {\rm amp} \sin\left(2 \pi {\fm freq} x + {\rm phase}\right) + {\rm baseline}
"""
return amp * np.cos(2 * np.pi * freq * x + phase) + baseline
return amp * np.sin(2 * np.pi * freq * x + phase) + baseline
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch.



def exponential_decay(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ class DragCalAnalysis(curve.CurveAnalysis):
name="series-0",
filter_kwargs={"series": 0},
plot_symbol="o",
model_description=r"{\rm amp} \cos\left(2 \pi\cdot {\rm freq}_0\cdot x "
r"- 2 \pi \beta\right) + {\rm base}",
),
curve.SeriesDef(
fit_func=lambda x, amp, freq0, freq1, freq2, beta, base: cos(
Expand All @@ -73,6 +75,8 @@ class DragCalAnalysis(curve.CurveAnalysis):
name="series-1",
filter_kwargs={"series": 1},
plot_symbol="^",
model_description=r"{\rm amp} \cos\left(2 \pi\cdot {\rm freq}_1\cdot x "
r"- 2 \pi \beta\right) + {\rm base}",
),
curve.SeriesDef(
fit_func=lambda x, amp, freq0, freq1, freq2, beta, base: cos(
Expand All @@ -82,6 +86,8 @@ class DragCalAnalysis(curve.CurveAnalysis):
name="series-2",
filter_kwargs={"series": 2},
plot_symbol="v",
model_description=r"{\rm amp} \cos\left(2 \pi\cdot {\rm freq}_2\cdot x "
r"- 2 \pi \beta\right) + {\rm base}",
),
]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ class FineAmplitudeAnalysis(curve.CurveAnalysis):
baseline=base,
),
plot_color="blue",
model_description=r"\frac{{\rm amp}}{2}\cos\left(x[{\rm d}\theta + {\rm apg} ] "
r"+ {\rm phase\_offset}\right)+{\rm base}",
)
]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ class OscillationAnalysis(curve.CurveAnalysis):
x, amp=amp, freq=freq, phase=phase, baseline=base
),
plot_color="blue",
model_description=r"{\rm amp} \cos\left(2 \pi\cdot {\rm freq}\cdot x "
r"+ {\rm phase}\right) + {\rm base}",
)
]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ class ResonanceAnalysis(curve.CurveAnalysis):
x, amp=a, sigma=sigma, x0=freq, baseline=b
),
plot_color="blue",
model_description=r"a \exp(-(x-f)^2/(2\sigma^2)) + b",
)
]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ class InterleavedRBAnalysis(RBAnalysis):
plot_color="red",
plot_symbol=".",
plot_fit_uncertainty=True,
model_description=r"a \alpha^{x} + b",
),
curve.SeriesDef(
name="Interleaved",
Expand All @@ -113,6 +114,7 @@ class InterleavedRBAnalysis(RBAnalysis):
plot_color="orange",
plot_symbol="^",
plot_fit_uncertainty=True,
model_description=r"a (\alpha_c\alpha)^{x} + b",
),
]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ class RBAnalysis(curve.CurveAnalysis):
),
plot_color="blue",
plot_fit_uncertainty=True,
model_description=r"a \alpha^x + b",
)
]

Expand Down
8 changes: 8 additions & 0 deletions releasenotes/notes/add-fit-models-e9b82e9d6c2aef43.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
other:
- |
``model_description`` is added to
:py:class:`~qiskit_experiments.curve_analysis.curve_data.SeriesDef`.
This field stores the string representation of the fit model of the curve.
This information is appended to the analysis result and will be
saved in the result database (if possible).
5 changes: 5 additions & 0 deletions test/curve_analysis/test_curve_fit.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,20 +113,23 @@ def setUp(self):
x, amp=p0, lamb=p1, baseline=p4
),
filter_kwargs={"type": 1, "valid": True},
model_description=r"p_0 * \exp(p_1 x) + p4",
),
SeriesDef(
name="curve2",
fit_func=lambda x, p0, p1, p2, p3, p4: fit_function.exponential_decay(
x, amp=p0, lamb=p2, baseline=p4
),
filter_kwargs={"type": 2, "valid": True},
model_description=r"p_0 * \exp(p_2 x) + p4",
),
SeriesDef(
name="curve3",
fit_func=lambda x, p0, p1, p2, p3, p4: fit_function.exponential_decay(
x, amp=p0, lamb=p3, baseline=p4
),
filter_kwargs={"type": 3, "valid": True},
model_description=r"p_0 * \exp(p_3 x) + p4",
),
],
)
Expand Down Expand Up @@ -321,6 +324,7 @@ def test_run_single_curve_analysis(self):
fit_func=lambda x, p0, p1, p2, p3: fit_function.exponential_decay(
x, amp=p0, lamb=p1, x0=p2, baseline=p3
),
model_description=r"p_0 \exp(p_1 x + p_2) + p_3",
)
],
)
Expand All @@ -347,6 +351,7 @@ def test_run_single_curve_analysis(self):
np.testing.assert_array_almost_equal(result.value.value, ref_popt, decimal=self.err_decimal)
self.assertEqual(result.extra["dof"], 46)
self.assertListEqual(result.extra["popt_keys"], ["p0", "p1", "p2", "p3"])
self.assertDictEqual(result.extra["fit_models"], {"curve1": r"p_0 \exp(p_1 x + p_2) + p_3"})

# special entry formatted for database
result = results[1]
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
[{"name": "@Parameters_InterleavedRBAnalysis", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": {"__type__": "array", "__value__": [0.5116650227730736, 0.9994768276408555, 0.9979725591597532, 0.4884021095472425]}, "stderr": {"__type__": "array", "__value__": [0.006437954091857918, 1.4847358402650982e-05, 6.882915444481367e-05, 0.006675424355241532]}, "unit": null}}}, "extra": {"popt_keys": ["a", "alpha", "alpha_c", "b"], "dof": 16, "covariance_mat": {"__type__": "array", "__value__": [[4.144725288887011e-05, 4.533933132185307e-08, 3.746653829699993e-07, -4.023979858687134e-05], [4.5339331321853074e-08, 2.2044405153677072e-10, 6.432549372321611e-10, -6.928087572143161e-08], [3.746653829699994e-07, 6.432549372321611e-10, 4.737452501588013e-09, -4.2638270013676844e-07], [-4.023979858687135e-05, -6.92808757214316e-08, -4.2638270013676844e-07, 4.456129032255182e-05]]}}}, {"name": "alpha", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": 0.9994768276408555, "stderr": 1.4847358402650982e-05, "unit": null}}}, "extra": {}}, {"name": "alpha_c", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": 0.9979725591597532, "stderr": 6.882915444481367e-05, "unit": null}}}, "extra": {}}, {"name": "EPC", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": 0.0010137204201233763, "stderr": 3.4414577222406835e-05, "unit": null}}}, "extra": {"EPC_systematic_err": 0.0010137204201233763, "EPC_systematic_bounds": [0.0, 0.0020274408402467525]}}]
[{"name": "@Parameters_InterleavedRBAnalysis", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": {"__type__": "array", "__value__": [0.5034561671663651, 0.9994727949681657, 0.9977551279697571, 0.49581463461118536]}, "stderr": {"__type__": "array", "__value__": [0.010251156479303655, 2.5780778918330006e-05, 0.00012837420188229864, 0.010490177588586015]}, "unit": null}}}, "extra": {"popt_keys": ["a", "alpha", "alpha_c", "b"], "dof": 16, "covariance_mat": {"__type__": "array", "__value__": [[0.00010508620916316932, 1.0217443095675483e-07, 1.0661366451271264e-06, -9.865292651801042e-05], [1.0217443095675484e-07, 6.646485616358089e-10, 1.943773589454093e-09, -1.776204727970427e-07], [1.0661366451271262e-06, 1.9437735894540925e-09, 1.6479935708917166e-08, -1.233244622053204e-06], [-9.865292651801042e-05, -1.776204727970427e-07, -1.233244622053204e-06, 0.0001100438258400723]]}, "fit_models": {"Standard": "a \\alpha^{x} + b", "Interleaved": "a (\\alpha_c\\alpha)^{x} + b"}}}, {"name": "alpha", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": 0.9994727949681657, "stderr": 2.5780778918330006e-05, "unit": null}}}, "extra": {}}, {"name": "alpha_c", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": 0.9977551279697571, "stderr": 0.00012837420188229864, "unit": null}}}, "extra": {}}, {"name": "EPC", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": 0.001122436015121464, "stderr": 6.418710094114932e-05, "unit": null}}}, "extra": {"EPC_systematic_err": 0.001122436015121464, "EPC_systematic_bounds": [0.0, 0.002244872030242928]}}]

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1 +1 @@
[{"name": "@Parameters_InterleavedRBAnalysis", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": {"__type__": "array", "__value__": [0.7342127078996477, 0.9884063217136179, 0.9927651616883224, 0.2543568492711422]}, "stderr": {"__type__": "array", "__value__": [0.004948839577232964, 0.00020370367690368603, 0.00044396411042263065, 0.004356375518781768]}, "unit": null}}}, "extra": {"popt_keys": ["a", "alpha", "alpha_c", "b"], "dof": 16, "covariance_mat": {"__type__": "array", "__value__": [[2.4491013161187343e-05, 5.236454920804876e-07, 1.2793043417064756e-06, -1.6442242444492406e-05], [5.236454920804876e-07, 4.149518798408131e-08, 4.9409520508775484e-08, -7.419439279427566e-07], [1.2793043417064754e-06, 4.940952050877548e-08, 1.971041313433578e-07, -1.5342339511770156e-06], [-1.6442242444492406e-05, -7.419439279427566e-07, -1.5342339511770158e-06, 1.8978007660641124e-05]]}}}, {"name": "alpha", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": 0.9884063217136179, "stderr": 0.00020370367690368603, "unit": null}}}, "extra": {}}, {"name": "alpha_c", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": 0.9927651616883224, "stderr": 0.00044396411042263065, "unit": null}}}, "extra": {}}, {"name": "EPC", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": 0.005426128733758195, "stderr": 0.000332973082816973, "unit": null}}}, "extra": {"EPC_systematic_err": 0.01196438869581501, "EPC_systematic_bounds": [0, 0.017390517429573205]}}]
[{"name": "@Parameters_InterleavedRBAnalysis", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": {"__type__": "array", "__value__": [0.7251425386126389, 0.9874511785804855, 0.9927473424015756, 0.2664779856707594]}, "stderr": {"__type__": "array", "__value__": [0.005664202737254954, 0.00020569131958238083, 0.00039769928395310864, 0.005864117641934524]}, "unit": null}}}, "extra": {"popt_keys": ["a", "alpha", "alpha_c", "b"], "dof": 16, "covariance_mat": {"__type__": "array", "__value__": [[3.208319264872652e-05, 1.0448534717564974e-06, 1.627583546356998e-06, -3.285490958063846e-05], [1.0448534717564977e-06, 4.230891895154112e-08, 5.057408974150914e-08, -1.106317359642681e-06], [1.627583546356998e-06, 5.057408974150913e-08, 1.5816472045681535e-07, -1.750695025460556e-06], [-3.285490958063846e-05, -1.106317359642681e-06, -1.750695025460556e-06, 3.438787571844772e-05]]}, "fit_models": {"Standard": "a \\alpha^{x} + b", "Interleaved": "a (\\alpha_c\\alpha)^{x} + b"}}}, {"name": "alpha", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": 0.9874511785804855, "stderr": 0.00020569131958238083, "unit": null}}}, "extra": {}}, {"name": "alpha_c", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": 0.9927473424015756, "stderr": 0.00039769928395310864, "unit": null}}}, "extra": {}}, {"name": "EPC", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": 0.005439493198818313, "stderr": 0.00029827446296483147, "unit": null}}}, "extra": {"EPC_systematic_err": 0.01338373893045347, "EPC_systematic_bounds": [0, 0.018823232129271783]}}]

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1 +1 @@
[{"name": "@Parameters_RBAnalysis", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": {"__type__": "array", "__value__": [0.9967817420311399, 0.9997606942463159, 2.813384952009873e-13]}, "stderr": {"__type__": "array", "__value__": [1.5428416345109068, 0.00041321430695411904, 1.5480528890603416]}, "unit": null}}}, "extra": {"popt_keys": ["a", "alpha", "b"], "dof": 7, "covariance_mat": {"__type__": "array", "__value__": [[2.3803603091802867, 0.0006371615470064913, -2.388380804138054], [0.0006371615470064913, 1.7074606347157292e-07, -0.0006393835737758766], [-2.388380804138054, -0.0006393835737758766, 2.3964677473280704]]}}}, {"name": "alpha", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": 0.9997606942463159, "stderr": 0.00041321430695411904, "unit": null}}}, "extra": {}}, {"name": "EPC", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": 0.00011965287684206904, "stderr": 0.00020660715347705952, "unit": null}}}, "extra": {}}, {"name": "EPG_x", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": 0.0005083368294731997, "stderr": null, "unit": null}}}, "extra": {}}]
[{"name": "@Parameters_RBAnalysis", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": {"__type__": "array", "__value__": [0.35777153783730536, 0.999206126929566, 0.6424033472489555]}, "stderr": {"__type__": "array", "__value__": [0.13354619096959772, 0.0004296014698631278, 0.1381255753346132]}, "unit": null}}}, "extra": {"popt_keys": ["a", "alpha", "b"], "dof": 7, "covariance_mat": {"__type__": "array", "__value__": [[0.017834585122488263, 5.677840091061019e-05, -0.018423379167709843], [5.67784009106102e-05, 1.8455742290855988e-07, -5.902946904590408e-05], [-0.018423379167709843, -5.902946904590408e-05, 0.019078674561517905]]}, "fit_models": {"Series-0": "a \\alpha^x + b"}}}, {"name": "alpha", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": 0.999206126929566, "stderr": 0.0004296014698631278, "unit": null}}}, "extra": {}}, {"name": "EPC", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": 0.00039693653521699623, "stderr": 0.0002148007349315639, "unit": null}}}, "extra": {}}, {"name": "EPG_x", "value": {"__type__": "__object__", "__value__": {"__name__": "FitVal", "__module__": "qiskit_experiments.database_service.db_fitval", "__kwargs__": {"value": 0.001687416879912102, "stderr": null, "unit": null}}}, "extra": {}}]
Loading