Skip to content

Commit

Permalink
Merge save and get external functions
Browse files Browse the repository at this point in the history
  • Loading branch information
mickahell committed Jan 20, 2024
1 parent 5071137 commit 81d37e0
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 71 deletions.
4 changes: 2 additions & 2 deletions .envrc
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ export DB_USER=root
export DB_PASSWORD=root
export DB_PORT=5432

#export DB_HOST=localhost # for local run
export DB_HOST=localhost # for local run
# If you run the api-server with Docker uncomment this next var
export DB_HOST=host.docker.internal # for Docker run
#export DB_HOST=host.docker.internal # for Docker run

export DJANGO_SUPERUSER_USERNAME=admin
export DJANGO_SUPERUSER_PASSWORD=admin
Expand Down
96 changes: 35 additions & 61 deletions client/purplecaffeine/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import json
import logging
import os
import re
import copy
from pathlib import Path
from typing import Optional, Union, List, Any, Dict
Expand All @@ -17,10 +18,11 @@
from qiskit import __qiskit_version__
from qiskit.circuit import QuantumCircuit
from qiskit.quantum_info.operators import Operator
from qiskit_ibm_runtime.utils import RuntimeEncoder

from purplecaffeine.exception import PurpleCaffeineException
from purplecaffeine.helpers import Configuration
from purplecaffeine.utils import TrialEncoder, TrialDecoder, CircEncoder
from purplecaffeine.utils import TrialEncoder, TrialDecoder


class Trial:
Expand Down Expand Up @@ -224,32 +226,20 @@ def read(self, trial_id: str) -> Trial:
return self.storage.get(trial_id=trial_id)

@staticmethod
def import_from_shared_file(path) -> Trial:
def import_from_shared_file(path: str, trial_id: str) -> Trial:
"""Import Trial for shared file.
Args:
path: full path of the file
trial_id: trial id of the folder
Returns:
Trial dict object
"""
with open(
os.path.join(path, "trial.json"), "r", encoding="utf-8"
) as trial_file:
trial_json = json.load(trial_file, cls=TrialDecoder)
if "id" in trial_json:
del trial_json["id"]
if "uuid" in trial_json:
del trial_json["uuid"]
trial = Trial(**trial_json)

for index, circuit in enumerate(copy.copy(trial.circuits)):
circ_path = os.path.join(path, f"circuit_{circuit[0]}.json")
with open(circ_path, "r", encoding="utf-8") as circ_file:
trial.circuits[index] = json.load(circ_file, cls=TrialDecoder)
return trial
return LocalStorage(path).get(trial_id=trial_id)

def export_to_shared_file(self, path) -> str:
def export_to_shared_file(self, path: str) -> str:
"""Export trial to shared file.
Args:
Expand All @@ -258,18 +248,8 @@ def export_to_shared_file(self, path) -> str:
Returns:
Full path of the file
"""
filename = os.path.join(path, f"trial_{self.uuid}/trial.json")
if not os.path.isdir(os.path.join(path, f"trial_{self.uuid}")):
os.makedirs(os.path.join(path, f"trial_{self.uuid}"))
with open(filename, "w", encoding="utf-8") as trial_file:
json.dump(self.__dict__, trial_file, cls=TrialEncoder, indent=4)

for circuit in self.circuits:
save_circuit = os.path.join(
path, f"trial_{self.uuid}/circuit_{circuit[0]}.json"
)
with open(save_circuit, "w", encoding="utf-8") as circuit_file:
json.dump(circuit, circuit_file, cls=CircEncoder, indent=4)
self.storage.path = path
self.storage.save(trial=self)

return os.path.join(path, f"trial_{self.uuid}")

Expand Down Expand Up @@ -497,18 +477,19 @@ def save(self, trial: Trial) -> str:
Returns:
self.path: path of the trial file
"""
save_path = os.path.join(self.path, f"trial_{trial.uuid}/trial.json")
if not os.path.isdir(os.path.join(self.path, f"trial_{trial.uuid}")):
os.makedirs(os.path.join(self.path, f"trial_{trial.uuid}"))
with open(save_path, "w", encoding="utf-8") as trial_file:
save_path = os.path.join(self.path, f"trial_{trial.uuid}")
if not os.path.isdir(save_path):
os.makedirs(save_path)

with open(
os.path.join(save_path, "trial.json"), "w", encoding="utf-8"
) as trial_file:
json.dump(trial.__dict__, trial_file, cls=TrialEncoder, indent=4)

for circuit in trial.circuits:
save_circuit = os.path.join(
self.path, f"trial_{trial.uuid}/circuit_{circuit[0]}.json"
)
save_circuit = os.path.join(save_path, f"circuit_{circuit[0]}.json")
with open(save_circuit, "w", encoding="utf-8") as circuit_file:
json.dump(circuit, circuit_file, cls=CircEncoder, indent=4)
json.dump(circuit, circuit_file, cls=RuntimeEncoder, indent=4)

return self.path

Expand All @@ -521,24 +502,24 @@ def get(self, trial_id: str) -> Trial:
Returns:
trial: object of a trial
"""
trial_path = os.path.join(self.path, f"trial_{trial_id}/trial.json")
if not os.path.isfile(trial_path):
trial_path = os.path.join(self.path, f"trial_{trial_id}")
if not os.path.isfile(os.path.join(trial_path, "trial.json")):
logging.warning(
"Your file %s does not exist.",
trial_path,
)
raise ValueError(trial_id)
with open(trial_path, "r", encoding="utf-8") as trial_file:
with open(
os.path.join(trial_path, "trial.json"), "r", encoding="utf-8"
) as trial_file:
trial = Trial(**json.load(trial_file, cls=TrialDecoder))

for index, circuit in enumerate(copy.copy(trial.circuits)):
circ_path = os.path.join(
self.path, f"trial_{trial_id}/circuit_{circuit[0]}.json"
)
with open(circ_path, "r", encoding="utf-8") as circ_file:
trial.circuits[index] = json.load(circ_file, cls=TrialDecoder)
for index, circuit in enumerate(copy.copy(trial.circuits)):
circ_path = os.path.join(trial_path, f"circuit_{circuit[0]}.json")
with open(circ_path, "r", encoding="utf-8") as circ_file:
trial.circuits[index] = json.load(circ_file, cls=TrialDecoder)

return trial
return trial

def list(
self,
Expand All @@ -561,24 +542,17 @@ def list(
offset = offset or 0
limit = limit or 10

trials_path = glob.glob(f"{self.path}/**/trial.json")
trials_path = glob.glob(f"{self.path}/trial_*")
trials_path.sort(key=os.path.getmtime, reverse=True)
trials = []
for path in trials_path:
with open(path, "r", encoding="utf-8") as trial_file:
trial_dict = Trial(**json.load(trial_file, cls=TrialDecoder))

for index, circuit in enumerate(copy.copy(trial_dict.circuits)):
circ_path = os.path.join(
f"{self.path}",
f"trial_{trial_dict.uuid}/circuit_{circuit[0]}.json",
trials.append(
self.get(
trial_id=re.search(r"trial_([^/]+)", os.path.basename(path)).group(
1
)
with open(circ_path, "r", encoding="utf-8") as circ_file:
trial_dict.circuits[index] = json.load(
circ_file, cls=TrialDecoder
)

trials.append(trial_dict)
)
)

if query:
trials = [
Expand Down
2 changes: 1 addition & 1 deletion client/purplecaffeine/utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@
TrialDecoder
"""

from .json import TrialEncoder, TrialDecoder, CircEncoder
from .json import TrialEncoder, TrialDecoder
4 changes: 0 additions & 4 deletions client/purplecaffeine/utils/json.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,3 @@ def object_hook(self, obj: Any) -> Any:
return None
return super().object_hook(obj)
return obj


class CircEncoder(RuntimeEncoder):
"""Json encoder for circuit."""
2 changes: 1 addition & 1 deletion client/tests/test_trial.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ def test_export_import(self):
)
# Import
new_trial = Trial("test_import").import_from_shared_file(
os.path.join(self.save_path, f"trial_{trial.uuid}")
self.save_path, trial.uuid
)
self.assertEqual(new_trial.description, "Short desc")
self.assertEqual(new_trial.metrics, [["test_metric", 42]])
Expand Down
6 changes: 4 additions & 2 deletions client/tests/utils/test_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
import copy
from unittest import TestCase

from qiskit_ibm_runtime.utils import RuntimeEncoder

from purplecaffeine.core import Trial
from purplecaffeine.utils import TrialEncoder, TrialDecoder, CircEncoder
from purplecaffeine.utils import TrialEncoder, TrialDecoder

from ..test_trial import dummy_trial

Expand All @@ -19,7 +21,7 @@ def test_encoder_decoder(self):
trial_encode = json.dumps(my_trial.__dict__, cls=TrialEncoder, indent=4)
self.assertTrue(isinstance(trial_encode, str))
for circuit in my_trial.circuits:
circ_encode = json.dumps(circuit, cls=CircEncoder, indent=4)
circ_encode = json.dumps(circuit, cls=RuntimeEncoder, indent=4)

# Decoder
trial_decode = Trial(**json.loads(trial_encode, cls=TrialDecoder))
Expand Down

0 comments on commit 81d37e0

Please sign in to comment.