{"id":37642188,"url":"https://github.com/peterjbrown519/dirng","last_synced_at":"2026-01-16T11:19:46.673Z","repository":{"id":33229389,"uuid":"124879112","full_name":"peterjbrown519/dirng","owner":"peterjbrown519","description":"A python package for constructing device-independent randomness expansion protocols.","archived":false,"fork":false,"pushed_at":"2023-07-06T21:24:47.000Z","size":116,"stargazers_count":8,"open_issues_count":3,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-11-27T17:47:01.272Z","etag":null,"topics":["device-independent","expansion","python","quantum-information","randomness"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/peterjbrown519.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-03-12T11:30:48.000Z","updated_at":"2024-11-03T13:46:36.000Z","dependencies_parsed_at":"2022-09-02T08:50:20.077Z","dependency_job_id":null,"html_url":"https://github.com/peterjbrown519/dirng","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/peterjbrown519/dirng","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterjbrown519%2Fdirng","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterjbrown519%2Fdirng/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterjbrown519%2Fdirng/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterjbrown519%2Fdirng/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/peterjbrown519","download_url":"https://codeload.github.com/peterjbrown519/dirng/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterjbrown519%2Fdirng/sbom","scorecard":{"id":728936,"data":{"date":"2025-08-11","repo":{"name":"github.com/peterjbrown519/dirng","commit":"52bc81450cc770e70831c0d1b3b07595e14370f0"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.9,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/17 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU General Public License v3.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":1,"reason":"9 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2022-42991 / GHSA-v3c5-jqr6-7qm8","Warn: Project is vulnerable to: PYSEC-2021-427 / GHSA-f865-m6cq-j9vx","Warn: Project is vulnerable to: PYSEC-2021-856 / GHSA-5545-2q6w-2gh6","Warn: Project is vulnerable to: GHSA-6p56-wp2h-9hxr","Warn: Project is vulnerable to: PYSEC-2019-108 / GHSA-9fq2-x9r6-wfmf","Warn: Project is vulnerable to: PYSEC-2021-857 / GHSA-f7c7-j99h-c22f","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: PYSEC-2023-102","Warn: Project is vulnerable to: PYSEC-2023-114"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 16 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-22T13:49:50.094Z","repository_id":33229389,"created_at":"2025-08-22T13:49:50.094Z","updated_at":"2025-08-22T13:49:50.094Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28478201,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T06:30:42.265Z","status":"ssl_error","status_checked_at":"2026-01-16T06:30:16.248Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["device-independent","expansion","python","quantum-information","randomness"],"created_at":"2026-01-16T11:19:45.988Z","updated_at":"2026-01-16T11:19:46.667Z","avatar_url":"https://github.com/peterjbrown519.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"**Please note that there is a bug in this code which is currently being fixed. The code will NOT give the correct rate calculations at the moment. This notice will be removed once the code has been fixed. -- Peter**\n\n####################\nOverview\n####################\nA python3 package for developing device-independent randomness expansion protocols - based on work in [DIRNG]_. Package aims to provide a user-friendly method of constructing and analysing device-independent randomness expansion protocols. The semidefinite relaxations are performed using the ncpol2sdpa package [NCPOL]_ and the resulting SDPs are computed using the SDPA solver [SDPA]_. Many thanks go to the developers of these latter two projects.\n\nHoping in the future to extend this to other DI tools, developing some DIQI library, e.g. DIQKD, DIRA, steering...\n\nHappy to hear from anyone who's interested in a similar project :)\n\n####################\nInstallation\n####################\n\nDependencies\n================\n\n\t**SDP solver**\n\n\t\tCurrently the only supported solvers are those from the sdpa family. They can be downloaded and extracted from their  sourceforge page_.\n\n\t\t**Important configuration note**\n\n\t\t\tThe default precision with which sdpa writes its solutions to file is 3 decimal places. This has to be increased prior to usage otherwise errors will be prevalent in computations. This precision can be modified by changing the param.sdpa file that comes with the solver. In particular, replacing\n\n\t\t\t\t*%+8.3e     char\\*  YPrint   (default %+8.3e,   NOPRINT skips printout)*\n\n\t\t\twith\n\n\t\t\t\t*%+8.8e     char\\*  YPrint   (default %+8.3e,   NOPRINT skips printout),*\n\n\t\t\twill increase the precision.\n\n.. _page: http://sdpa.sourceforge.net/download.html\n\nNote: To automatically point the package to the solver, one can edit the dirng_config.json file replacing '/path/to/solver/' with the appropriate path. The location of the config file can be found by running \\'*pip3 show dirng*\\', it should be in the /etc/ subdirectory.  (**Windows users**: Paths must be specified using '\\\\\\\\' instead of '\\\\' in the path name.)\n\nIf this is done then the solver argument never has to be passed to the device, it will be set automatically. \n\nInstallation with pip\n=========================\nTo install the latest version run\n\n.. code-block:: console\n\n\tpip3 install git+https://github.com/peterjbrown519/dirng.git\n\n..\n\n#####\nUsage\n#####\nExplicit examples are provided in */examples/* directory. Here we review the main structure of the package and look at a general script demonstrating its usage. Those looking for a quick start can skip straight to that script. For full details on functionality please see the comments within the module's files.\n\nClasses\n========\nThere are three classes in dirng.\n\n1.\t**Game**\n\n\t*Description*\n\n\t\tA Game object represents a nonlocal game which will be played by the untrusted devices.\n\n\t*Attributes*\n\n\t\t- **name**: Name of the game.\n\t\t- **score**: Expected score achieved by the untrusted devices.\n\t\t- **delta**: Width of confidence interval about the expected score.\n\t\t- **matrix**: Matrix representing the coefficients of the Bell-expression.\n\n\t*Usage*\n\n\t\t.. code-block:: python3\n\t\t\n\t\t\tfrom dirng import Game\n\n\t\t\t\"\"\"\n\t\t\tLet's create the CHSH game - 2 inputs / 2 outputs\n\n\t\t\tIf p(a,b|x,y) is the distribution of the devices, then we write our\n\t\t\tBell-expressions as \\sum_{abxy} s_ab|xy p(a,b|x,y). The matrix of\n\t\t\tcoefficients is then\n\t\t\t\t\t\t\t|  s00|00\ts01|00\ts00|01\ts01|01\t|\n\t\t\t\t\t\t\t|  s10|00\ts11|00\ts10|01\ts11|01\t|\n\t\t\t\t\t\t\t|  s00|10\ts01|10\ts00|11\ts01|11\t|\n\t\t\t\t\t\t\t|  s10|10\ts11|10\ts10|11\ts11|11\t|\n\t\t\t\"\"\"\n\n\t\t\tchsh_coefficients = [[ 0.25, 0.00, 0.25, 0.00],\n\t\t\t\t\t     [ 0.00, 0.25, 0.00, 0.25],\n\t\t\t\t\t     [ 0.25, 0.00, 0.00, 0.25],\n\t\t\t\t\t     [ 0.00, 0.25, 0.25, 0.00]]\n\n\t\t\t# Initialising the game object\n\t\t\tchsh = Game(name = 'chsh', score = 0.853, matrix = chsh_coefficients, delta = 0.001)\n\n\t\t\t# If the score was maybe a little ambitious, we can change it...\n\t\t\tchsh.score = 0.75\n\n2.\t**Devices**\n\n\t*Description*\n\n\t\tA pair of untrusted devices. They play nonlocal games and produce random numbers.\n\n\t*Attributes*\n\n\t\t- **name**: Name given to the devices.\n\t\t- **io_config**: The input output configuration of the devices. If m_i, n_j are the number of outputs for the i-th and j-th measurement of the 1st and 2nd device respectively. Then we write the io_config as [[m_1,m_2,...],[n_1,n_2,...]].\n\t\t- **generation_inputs**: Device inputs used during generation rounds.\n\t\t- **relaxation_level**: Level of NPA hierarchy used during computations.\n\t\t- **solver**: /path/to/the/solver/used/\n\t\t- **games**: A list of Game objects played by the device.\n\n\t*Usage*\n\n\t\t.. code-block:: python3\n\n\t\t\tfrom dirng import Devices\n\n\t\t\t# We can initialise the device by passing it a settings dictionary.\n\t\t\tdevice_settings = {\n\t\t\t\t'name' : 'Mittens',\n\t\t\t\t'io_config' : [[2,2], [2,2]],\n\t\t\t\t'generation_inputs' : [0,0],\n\t\t\t\t'relaxation_level' : 2,\n\t\t\t\t'games' : [chsh],\n\t\t\t\t'solver' : '/path/to/a/solver/'\n\t\t\t}\n\n\t\t\tdev = Devices(device_settings)\n\n\t\t\t# As before these attributes can be changed after initialisation\n\t\t\tdev.generation_inputs = [1,1]\n\t\t\tdev.relaxation_level = 3\n\n\t\t\t# We can also add additional games if they are compatible with our devices alphabet.\n\t\t\tdev.games += another_game_object\n\n\t\t\t# The randomness can then be calculated by calling the hmin attribute\n\t\t\trandomness = dev.hmin\n\t\t\tprint(randomness)\n\n\t\t\t# For a general view of the device we can also call print\n\t\t\tprint(dev)\n\n\t\tIf we want to change the scores of the games played by the device, we can set them all at once by\n\n\t\t.. code-block:: python3\n\n\t\t\t# Setting scores (and the delta values) for the two games that dev plays\n\t\t\tdev.score = [0.8, 0.7]\n\t\t\tdev.delta = [0.0001, 0.001]\n\n\t\t\t# Recompute the min-entropy\n\t\t\tprint(dev.hmin)\n\n\t\tThe games are ordered by the device alphabetically w.r.t. their names. So the list of scores should reflect that ordering.\n\n\t\tA useful function for calculating score vectors is distribution2Score()\n\n\t\t.. code-block:: python3\n\n\t\t\t# Suppose we have some distribution\n\t\t\tp = [[0.20, 0.30, 0.30, 0.20],\n\t\t\t     [0.30, 0.20, 0.20, 0.30],\n\t\t\t     [0.25, 0.25, 0.25, 0.25],\n\t\t\t     [0.25, 0.25, 0.25, 0.25]]\n\n\t\t\t# We can calculate the expected score vector for a device pair by\n\t\t\tw = dev.distribution2Score(p)\n\n\t\t\t# We can then set that score like before\n\t\t\tdev.score = w\n\n3.\t**Protocol**\n\n\t*Description*\n\n\t\tThe protocol object stores the parameters of the randomness accumulation protocol and alongside the device object, it is used to calculate the randomness accumulation rates as certified by the entropy accumulation theorem [EAT]_.\n\n\t*Attributes*\n\n\t\t- **n**: The number of rounds (interactions with the devices) in the protocol.\n\t\t- **y**: The independent probability with which any given round is a testing round.\n\t\t- **eps_smooth**: The smoothing epsilon.\n\t\t- **eps_eat**: The entropy accumulation error.\n\n\t*Usage*\n\n\t\tAs before we can initialise the object by passing a settings dictionary.\n\n\t\t.. code-block:: python3\n\n\t\t\tfrom dirng import Protocol\n\n\t\t\tprotocol_settings = {\n\t\t\t\t'n' : 1e10,\n\t\t\t\t'y' : 0.005,\n\t\t\t\t'eps_smooth' : 1e-8,\n\t\t\t\t'eps_eat' : 1e-8\n\t\t\t}\n\t\t\tprotocol = Protocol(protocol_settings)\n\n\t\t\t# Changing attributes still works in the same way\n\t\t\tprotocol.n = 1e12\n\n\t\t\t# The protocol can also display its current state via the print method\n\t\t\tprint(protocol)\n\n\t\tIf we pass the untrusted device object we created earlier to the protocol then we can calculate the completeness error.\n\n\t\t.. code-block python3\n\n\t\t\tcompleteness = protocol.completeness(dev)\n\n\t\tNow we have everything we need to compute the entropy accumulation rate (entropy gain per round) of our protocol. When the function **eatRate()** is called a min-tradeoff function (see [EAT]_) is chosen, and the corresponding accumulation rates are calculated.\n\n\t\t**Note**: The default choice of min-tradeoff function may not yield the best accumulation rates, to aid with this we include a second method **optimiseFminChoice()** which performs a gradient ascent algorithm to improve this choice.\n\n\t\t.. code-block:: python3\n\n\n\t\t\toriginal_eat_rate = protocol.eatRate(dev)\n\t\t\toptimised_eat_rate = protocol.optimiseFminChoice(dev)\n\n\t\t\t# Let's see how much we improved\n\t\t\tprint('The default min-tradeoff choice gave {:.3f} bits per round of entropy.'.format(original_eat_rate))\n\t\t\tprint('Whereas the optimised choice of min-tradeoff function gave {:.3f} bits per round.'.format(optimised_eat_rate))\n\n\nOther functions\n===============\n\nThe package contains various other functions and the user is encouraged to read the explanatory comments within the files. Briefly, in addition to the class files there is\n\n- **dirng.qubit_methods**: Contains functions implementing a simple model of the untrusted devices as entangled qubit systems. In particular includes modelling of inefficient detectors and white noise.\n- **dirng.eat_methods**: Further functions relating to the EAT and the calculation of entropy accumulation rates.\n\nExtended CHSH protocol example\n==============================\n\nBelow is a script implementing the extended CHSH protocol which was given as an example protocol in [DIRNG]_. A more verbose version is given in examples/chsh.py.\n\n.. code-block:: python3\n\n\tfrom dirng import Game, Protocol, Devices\n\tfrom math import sqrt\n\n\tSOLVER = '/path/to/a/solver/'\n\n\t# Initialising the device\n\tdevice_settings = \t{'name' : 'chsh',\n\t\t\t\t'io_config' : [[2,2], [2,2,2]],\n\t\t\t\t'relaxation_level' : 2,\n\t\t\t\t'generation_inputs' : [1,2],\n\t\t\t\t'solver' : SOLVER}\n\tdev = di.Devices(device_settings)\n\n\t# Creating the games and add them\n\talignment_coefficients = \t[[ 0.00, 0.00, 0.00, 0.00, 1.00, 0.00],\n\t\t\t\t\t[ 0.00, 0.00, 0.00, 0.00, 0.00, 1.00],\n\t\t\t\t\t[ 0.00, 0.00, 0.00, 0.00, 0.00, 0.00],\n\t\t\t\t\t[ 0.00, 0.00, 0.00, 0.00, 0.00, 0.00]]\n\tchsh_coefficients = \t\t[[ 0.25, 0.00, 0.25, 0.00, 0.00, 0.00],\n\t\t\t\t\t[ 0.00, 0.25, 0.00, 0.25, 0.00, 0.00],\n\t\t\t\t\t[ 0.25, 0.00, 0.00, 0.25, 0.00, 0.00],\n\t\t\t\t\t[ 0.00, 0.25, 0.25, 0.00, 0.00, 0.00]]\n\n\talign = Game(name = 'align', matrix = alignment_coefficients, score = 1.00, delta=0.001)\n\tchsh = Game(name = 'chsh', matrix = chsh_coefficients, score = 0.5 + sqrt(2)/4, delta=0.001)\n\n\tdev.games = [align, chsh]\n\n\t# We should get hmin = 2 bits\n\tprint(dev.hmin)\n\n\t\"\"\"\n\tPart 2. accumulation rates\n\t\"\"\"\n\t# Protocol setup\n\tprotocol_settings =\t{'n' \t\t\t\t: 1e12,\n\t\t\t\t\t\t 'y'\t\t\t\t: 5e-3,\n\t\t\t\t\t\t 'eps_smooth'\t\t: 1e-12,\n\t\t\t\t\t\t 'eps_eat'\t\t\t: 1e-12}\n\tprotocol = Protocol(protocol_settings)\n\tprint('The completeness error is: ', protocol.completeness(dev))\n\n\t# Calculate the initial accumulation rate -- this may be quite negative\n\t# at T'sirelon's bound due to a steep gradient in min-tradeoff function space.\n\tinitial_rate = protocol.eatRate(dev)\n\tprint('The initial rate was {:.3f} bits per round'.format(initial_rate))\n\n\t# Optimise the EAT rate\n\toptimised_rate = protocol.optimiseFminChoice(dev, num_iterations = 24)\n\tprint('The optimised rate is {:.3f} bits per round'.format(random_rate))\n\tav, lv, v, _, status = dev.fmin_variables\n\tprint('This was achieved by the min-tradeoff function corresponding to the score vector ', v)\n\n\n###################\nReferences\n###################\n\n.. [DIRNG] Peter J. Brown, Sammy Ragy and Roger Colbeck, \"An adaptive framework for quantum-secure device-independent randomness expansion\", arXiv:1810.13346_, 2018.\n.. [NCPOL] Peter Wittek. Algorithm 950: Ncpol2sdpa---Sparse Semidefinite Programming Relaxations for Polynomial Optimization Problems of Noncommuting Variables. ACM Transactions on Mathematical Software, 41(3), 21, 2015. DOI: 10.1145/2699464. arXiv:1308.6029. Code available on gitlab_.\n.. [SDPA] \"A high-performance software package for semidefinite programs: SDPA 7,\" Makoto Yamashita, Katsuki Fujisawa, Kazuhide Nakata, Maho Nakata, Mituhiro Fukuda, Kazuhiro Kobayashi, and Kazushige Goto, Research Report B-460 Dept. of Mathematical and Computing Science, Tokyo Institute of Technology, Tokyo, Japan, September, 2010. Solvers available at their sourceforge page_.\n.. [EAT] Frédéric Dupuis and Omar Fawzi, “Entropy accumulation with improved second-order,” arXiv:1805.11652_, 2018.\n\n.. _arXiv:1810.13346: https://arxiv.org/abs/1810.13346\n.. _gitlab: https://gitlab.com/peterwittek/ncpol2sdpa\n\n.. _arXiv:quant-ph/0306129: https://arxiv.org/abs/quant-ph/0306129\n.. _arXiv:1805.11652: https://arxiv.org/abs/1805.11652\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeterjbrown519%2Fdirng","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpeterjbrown519%2Fdirng","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeterjbrown519%2Fdirng/lists"}