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
4 changes: 2 additions & 2 deletions .github/workflows/unit_testing_linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ on:

jobs:
test:
runs-on: ubuntu-20.04
runs-on: ubuntu-24.04
strategy:
matrix:
python-version: [ '3.6', '3.7', '3.8', '3.9', '3.10', '3.11', '3.12', '3.13' ]
python-version: [ '3.8', '3.9', '3.10', '3.11', '3.12', '3.13' ]

steps:
- uses: actions/checkout@v4
Expand Down
2 changes: 1 addition & 1 deletion src/quocslib/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
from __future__ import absolute_import, division, print_function, unicode_literals

__VERSION__ = "0.0.63"
__VERSION__ = "0.0.64"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

lloks good to me

16 changes: 13 additions & 3 deletions src/quocslib/communication/AllInOneCommunication.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

import os
import time
import datetime
from typing import List

from quocslib.utils.AbstractFoM import AbstractFoM
Expand Down Expand Up @@ -59,18 +60,28 @@ def __init__(self,
# Pre job name
pre_job_name = interface_job_name
# Datetime for 1-1 association
self.date_time = str(time.strftime("%Y%m%d_%H%M%S"))
self.date_time = datetime.datetime.now().strftime("%Y%m%d_%H%M%S_%f")
# Client job name to send to the Server
self.client_job_name = self.date_time + "_" + pre_job_name
###
# Logging, Results, Figure of merit evaluation ...
###
# Optimization folder
optimization_folder = "QuOCS_Results"
self.results_path = os.path.join(os.getcwd(), optimization_folder, self.client_job_name)
if not os.path.isdir(os.path.join(os.getcwd(), optimization_folder)):
os.makedirs(os.path.join(os.getcwd(), optimization_folder))
# Create the folder for logging and results
self.results_path = os.path.join(os.getcwd(), optimization_folder, self.client_job_name)
# # check if folder already exists
# if os.path.isdir(self.results_path):
# # if it exists, include microseconds of time
# self.date_time = datetime.datetime.now().strftime("%Y%m%d_%H%M%S_%f")
# self.client_job_name = self.date_time + "_" + pre_job_name
# self.results_path = os.path.join(os.getcwd(), optimization_folder, self.client_job_name)
# check if it already exists
if os.path.isdir(self.results_path):
raise FileExistsError("The folder {0} already exists. Please change the job name.".format(self.results_path))
# Create the folder for logging and results
os.makedirs(self.results_path)
# Write the current quocs lib version in the file
with open(os.path.join(self.results_path, "quocs_version.txt"), "w") as version_file:
Expand All @@ -81,7 +92,6 @@ def __init__(self,
self.print_general_log = True
# Figure of merit object
self.FoM_obj = FoM_obj
# TODO Thinks whether it is a good idea dumping the results
# Dumping data object
self.dump_obj = dump_attribute(self.results_path, self.date_time, dump_format)
# Handle exit object
Expand Down
4 changes: 2 additions & 2 deletions src/quocslib/optimizationalgorithms/ADAlgorithm.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,13 +77,13 @@ def __init__(self, optimization_dict: dict = None, communication_obj=None, FoM_o
self.rng = RandomNumberGenerator(seed_number=seed_number)
except (TypeError, KeyError):
default_seed_number = np.random.randint(0, 10000)
message = "Seed number must be an integer value. Set {0} as a seed numer for this optimization".format(
message = "Seed number must be an integer value. Set {0} as a seed number for this optimization".format(
default_seed_number)
self.rng = RandomNumberGenerator(seed_number=default_seed_number)
self.comm_obj.print_logger(message, level=30)
else:
default_seed_number = np.random.randint(0, 10000)
message = "Seed number must be an integer value. Set {0} as a seed numer for this optimization".format(
message = "Seed number must be an integer value. Set {0} as a seed number for this optimization".format(
default_seed_number)
self.rng = RandomNumberGenerator(seed_number=default_seed_number)
self.comm_obj.print_logger(message, level=30)
Expand Down
2 changes: 1 addition & 1 deletion src/quocslib/optimizationalgorithms/GRAPEAlgorithm.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ def __init__(self, optimization_dict: dict = None, communication_obj=None, FoM_o
seed_number = alg_parameters["random_number_generator"]["seed_number"]
except (TypeError, KeyError):
seed_number = 2022
message = "Seed number must be an integer value. Set {0} as a seed numer for this optimization".format(
message = "Seed number must be an integer value. Set {0} as a seed number for this optimization".format(
seed_number)
self.comm_obj.print_logger(message, level=30)
self.rng = RandomNumberGenerator(seed_number=seed_number)
Expand Down
2 changes: 1 addition & 1 deletion src/quocslib/optimizationalgorithms/dCRABAlgorithm.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ def __init__(self, optimization_dict: dict = None, communication_obj=None, **kwa
self.rng = RandomNumberGenerator(seed_number=seed_number)
except (TypeError, KeyError):
default_seed_number = 2022
message = "Seed number must be an integer value. Set {0} as a seed numer for this optimization".format(
message = "Seed number must be an integer value. Set {0} as a seed number for this optimization".format(
default_seed_number)
self.rng = RandomNumberGenerator(seed_number=default_seed_number)
self.comm_obj.print_logger(message, level=30)
Expand Down
66 changes: 66 additions & 0 deletions tests/test_quick_parallel_jobs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
from quocslib.utils.AbstractFoM import AbstractFoM
from quocslib.utils.inputoutput import readjson
from quocslib.Optimizer import Optimizer
from scipy.optimize import rosen
import numpy as np
import os
import pytest
import threading


class RosenFoM(AbstractFoM):
def __init__(self, args_dict: dict = None):
if args_dict is None:
args_dict = {}

self.FoM_list = []
self.param_list = []
self.save_path = ""

def save_FoM(self):
np.savetxt(os.path.join(self.save_path, 'FoM.txt'), self.FoM_list)
np.savetxt(os.path.join(self.save_path, 'params.txt'), self.param_list)

def set_save_path(self, save_path: str = ""):
self.save_path = save_path

def get_FoM(self, pulses: list = [], parameters: list = [], timegrids: list = []) -> dict:

FoM = rosen(np.asarray(parameters))

self.FoM_list.append(FoM)
self.param_list.append(parameters)

return {"FoM": FoM}


def main(optimization_dictionary: dict):

FoM_object = RosenFoM()

optimization_obj = Optimizer(optimization_dictionary, FoM_object)

FoM_object.set_save_path(optimization_obj.results_path)

optimization_obj.execute()

FoM_object.save_FoM()


def test_parameter_optimization():
# get the optimization settings from the json dictionary
folder = os.path.dirname(os.path.realpath(__file__))
optimization_dictionary = readjson(os.path.join(folder, "opt_Rosen_NM.json"))
opt_dict_1 = optimization_dictionary.copy()
opt_dict_2 = optimization_dictionary.copy()
opt_dict_1["optimization_client_name"] = "Check_quick_parallel_job_1"
opt_dict_2["optimization_client_name"] = "Check_quick_parallel_job_2"

t1 = threading.Thread(target=main, args=(opt_dict_1, ))
t2 = threading.Thread(target=main, args=(opt_dict_2, ))

t1.start()
t2.start()

t1.join(timeout=10)
t2.join(timeout=10)
Loading