# Difference between revisions of "NonlocalGameValue"

 Other toolboxes required NonlocalGameValue Computes the maximum value of a two-player non-local game CVX BCSGameValueBellInequalityMaxNPAHierarchyXORGameValue Nonlocality and Bell inequalities no

NonlocalGameValue is a function that computes the maximum possible value of a given non-local game under either classical mechanics, quantum mechanics, or general no-signalling theories. In the classical and non-signalling cases, an exact value is computed, whereas the value computed in the quantum case is only an upper bound (found using the NPA hierarchy).

## Syntax

• NGVAL = NonlocalGameValue(P,V)
• NGVAL = NonlocalGameValue(P,V,MTYPE)
• NGVAL = NonlocalGameValue(P,V,MTYPE,K)

## Argument descriptions

• P: A probability matrix whose $(x,y)$-entry gives the probability that the referee asks Alice question $x$ and Bob question $y$.
• V: A 4-D array whose $(a,b,x,y)$-entry gives the value awarded to Alice and Bob if they reply with answers $(a,b)$ to questions $(x,y)$.
• MTYPE (optional, default 'classical'): A string indicating which type of theory should be used when computing the maximum value of the non-local game. Must be one of 'classical', 'quantum', or 'nosignal'. If MTYPE = 'quantum' then only an upper bound on the non-local game is computed, not necessarily the best upper bound (see the argument K below).
• K (optional, default 1): If MTYPE = 'quantum' then this is a non-negative integer indicating what level of the NPA hierarchy should be used when bounding the value of the non-local game. Higher values of K give better bounds, but require more memory and time. Alternatively, K can be a string of a form like '1+ab+aab', which indicates that an intermediate level of the hierarchy should be used, where this example uses all products of 1 measurement, all products of one Alice and one Bob measurement, and all products of two Alice and one Bob measurement. Use plus signs to separate the different categories of products, as above. The first character of this string should always be a number, indicating the base level to use. If MTYPE is anything other than 'quantum' then K has no effect.

## Examples

### The CHSH inequality

One formulation of the CHSH inequality is as follows:

• A referee asks Alice a question $x \in \{0,1\}$ and Bob a question $y \in \{0,1\}$.
• Alice and Bob then reply with answers $a \in \{0,1\}$ and $b \in \{0,1\}$ respectively.
• Alice and Bob win if and only if $a \oplus b = xy$.

The optimal probability with which Alice and Bob can win this game in classical, quantum, and no-signalling theories are as follows:

>> d = 2;
>> p = ones(d,d)/d^2;
>> V = zeros(d,d,d,d);
>> for a = 1:d
for b = 1:d
for x = 1:d
for y = 1:d
if(mod(a+b+x*y,d)==0)
V(a,b,x,y) = 1;
end
end
end
end
end
>> NonlocalGameValue(p,V,'classical')

ans =

0.7500

>> NonlocalGameValue(p,V,'quantum',1)

ans =

0.8536

>> NonlocalGameValue(p,V,'nosignal')

ans =

1.0000

### The CHSH-d inequality

A generalization of the CHSH inequality to higher dimensions is exactly as above, except each of $a,b,x,y$ are taken from the set $\{0,1,\ldots,d-1\}$. The following code computes the values of the CHSH-3 game:

>> d = 3;
>> p = ones(d,d)/d^2;
>> V = zeros(d,d,d,d);
>> for a = 1:d
for b = 1:d
for x = 1:d
for y = 1:d
if(mod(a+b+x*y,d)==0)
V(a,b,x,y) = 1;
end
end
end
end
end
>> NonlocalGameValue(p,V,'classical')

ans =

0.6667

>> NonlocalGameValue(p,V,'quantum',1)

ans =

0.7182

>> NonlocalGameValue(p,V,'quantum',2)

ans =

0.7182

>> NonlocalGameValue(p,V,'quantum','2+aab')

ans =

0.7124

>> NonlocalGameValue(p,V,'nosignal')

ans =

1.0000

### The Fortnow-Feige-Lovász game

The Fortnow-Feige-Lovász (FFL) game is well-known example of a non-local game for which perfect parallel repetition does not hold (i.e., quantum players playing two copies of the game in parallel can do better than they can by playing the games in succession).

The game has binary inputs and outputs, and is defined by the rule that the referee asks Alice and Bob the question pair $(x,y) = (0,0)$, $(0,1)$, or $(1,0)$ with probability $1/3$ each, and Alice and Bob win if and only if their answers satisfy $x \vee a \neq y \vee b$, where $\vee$ denotes the bitwise OR operation.

It is known that both the classical value and quantum value of this game equal $2/3$, which we can verify as follows:

>> p = [1 1;1 0]/3;
>> V = zeros(2,2,2,2);
>> for a = 1:2
for b = 1:2
for x = 1:2
for y = 1:2
if(max(x,a) ~= max(y,b))
V(a,b,x,y) = 1;
end
end
end
end
end
>> NonlocalGameValue(p,V,'classical')

ans =

0.6667

>> NonlocalGameValue(p,V,'quantum',1)

ans =

0.6667

#### Parallel repetition

In fact, we can even compute the classical and quantum values of two copies of the FFL game being run in parallel: we simply specify the REPT input argument to be 2:

>> NonlocalGameValue(p,V,'classical',1,2)

ans =

0.6667

>> NonlocalGameValue(p,V,'quantum',1,2)

ans =

0.6667

Indeed, the fact that both of these values also equal $2/3$ is a known fact . Note that in the command NonlocalGameValue(p,V,'classical',1,2), the "1" that is provided as the value of K does not do anything: it is simply provided as a placeholder so that we can set REPT = 2 in the next input argument (e.g., we could have just as well entered the command NonlocalGameValue(p,V,'classical',9873,2), and the same calculation would have been carried out).

## Source code

Click on "expand" to the right to view the MATLAB source code for this function.

1. %%  NONLOCALGAMEVALUE    Computes the maximum value of a two-player non-local game
2. %   This function has two required input arguments:
3. %     P: a matrix whose (x,y)-entry is the probability that the referee
4. %        asks Alice question x and Bob question y
5. %     V: a 4-D array whose (a,b,x,y)-entry is the value given to Alice and
6. %        Bob when they provide answers a and b respectively to questions x
7. %        and y.
8. %
9. %   NGVAL = NonlocalGameValue(P,V) is the maximum value that the specified
10. %   non-local game can take on in classical mechanics. For the maximum
11. %   quantum or no-signalling value, see the optional arguments described
12. %   below.
13. %
14. %   This function has three optional input arguments:
15. %     MTYPE (default 'classical'): one of 'classical', 'quantum', or
16. %       'nosignal', indicating what type of nonlocal game value should be
17. %       computed. IMPORTANT NOTE: if MTYPE='quantum' then only an upper
18. %       bound on the non-local game value is computed, not its exact value
19. %       (see the argument K below).
20. %     K (default 1): if MYTPE='quantum', then K is a non-negative integer
21. %       or string indicating what level of the NPA hierarchy to use to
22. %       bound the non-local game (higher values give better bounds, but
23. %       require more computation time). See the NPAHierarchy function for
24. %       details. If MTYPE is anything else, then K is simply ignored.
25. %     REPT (default 1): the number of times that the non-local game should
26. %       be played in parallel (i.e., the number of repetitions of the
27. %       game).
28. %
29. %   NGVAL = NonlocalGameValue(P,V,MTYPE,K,REPT) is the maximum value that
30. %   the specified non-local game can take on in the setting (classical,
31. %   quantum or no-signalling) specified by MTYPE.
32. %
33. %   URL: http://www.qetlab.com/NonlocalGameValue
34. 
35. %   requires: CVX (http://cvxr.com/cvx/), NPAHierarchy.m, opt_args.m,
36. %             update_odometer.m
37. %
38. %   author: Nathaniel Johnston (nathaniel@njohnston.ca)
39. %           Mateus Ara�jo (wrote classical value computation)
40. %   package: QETLAB
41. %   last updated: May 29, 2020
42. 
43. function ngval = NonlocalGameValue(p,V,varargin)
44. 
45.     % set optional argument defaults: MTYPE='classical', K=1, REPT=1
46.     [mtype,k,rept] = opt_args({ 'classical', 1, 1 },varargin{:});
47. 
48.     % Get some basic values.
49.     [ma,mb] = size(p);
50.     oa = size(V,1);
51.     ob = size(V,2);
52. 
53.     % Are we playing the game multiple times? If so, adjust p and V
54.     % accordingly.
55.     if(rept > 1)
56.         % Create the new probability array.
57.         p = Tensor(p,rept);
58. 
59.         % Create the new winning output array (this is more complicated
60.         % since MATLAB doesn't have any built-in functions for tensoring
61.         % together 4D arrays).
62.         V2 = zeros(oa^rept,ob^rept,ma^rept,mb^rept);
63.         i_ind = zeros(1,rept);
64.         j_ind = zeros(1,rept);
65.         for i = 1:ma^rept
66.             for j = 1:mb^rept
67.                 for l = rept:-1:1
68.                     to_tensor{l} = V(:,:,i_ind(l)+1,j_ind(l)+1);
69.                 end
70.                 V2(:,:,i,j) = Tensor(to_tensor);
71. 
72.                 j_ind = update_odometer(j_ind,mb*ones(1,rept));
73.             end
74.             i_ind = update_odometer(i_ind,ma*ones(1,rept));
75.         end
76.         V = V2;
77. 
78.         % Update some computed values.
79.         ma = ma^rept;
80.         mb = mb^rept;
81.         oa = oa^rept;
82.         ob = ob^rept;
83.     end
84. 
85.     % The no-signalling maximum is just implemented by taking the zero-th
86.     % level of the NPA (quantum) hierarchy.
87.     if(strcmpi(mtype,'nosignal'))
88.         mtype = 'quantum';
89.         k = 0;
90.     end
91. 
92.     % Compute the maximum value of the non-local game, depending on which
93.     % type of maximum was requested.
94.     if(strcmpi(mtype,'quantum'))
95.         cvx_begin quiet
96.             variable q(oa,ob,ma,mb);
97.             maximize sum(sum(p.*squeeze(sum(sum(V.*q,1),2))))
98.             subject to
99.                 NPAHierarchy(q,k) == 1;
100.         cvx_end
101. 
102.         ngval = cvx_optval;
103. 
104.         % Deal with error messages.
105.         if(strcmpi(cvx_status,'Inaccurate/Solved'))
106.             warning('NonlocalGameValue:NumericalProblems','Minor numerical problems encountered by CVX. Consider adjusting the tolerance level TOL and re-running the script.');
107.         elseif(strcmpi(cvx_status,'Inaccurate/Infeasible'))
108.             warning('NonlocalGameValue:NumericalProblems','Minor numerical problems encountered by CVX. Consider adjusting the tolerance level TOL and re-running the script.');
109.         elseif(strcmpi(cvx_status,'Unbounded') || strcmpi(cvx_status,'Inaccurate/Unbounded') || strcmpi(cvx_status,'Failed'))
110.             error('NonlocalGameValue:NumericalProblems',strcat('Numerical problems encountered (CVX status: ',cvx_status,'). Please try adjusting the tolerance level TOL.'));
111.         end
112.     elseif(strcmpi(mtype,'classical'))
113.         % Compute the classical maximum value just by looping over Bob's strategies
114.         % and taking Alice's optimal strategy for each.
115.         for x=1:ma
116.             for y=1:mb
117.                 V(:,:,x,y) = p(x,y)*V(:,:,x,y);
118.             end
119.         end
120.         ngval = -Inf;
121.         b_ind = zeros(1,mb);
122.         if (oa^ma < ob^mb) % we choose Bob as the party with the fewest strategies
123.             V = permute(V,[3,4,1,2]);
124.             [oa,ob,ma,mb] = size(V);
125.         end
126.         V = permute(V,[1 3 2 4]); % this is necessary to avoid having to call squeeze later
127. 
128.         if (ob^mb <= 10^6)  % for small problems we don't parallelize
129.            parallel_threads = 0;
130.         else
131.            parallel_threads = Inf;
132.         end
133. 
134.         parfor (i = 0:ob^mb-1, parallel_threads)
135.             b_ind = integer_digits(i,ob,mb);
136.             Valice = zeros(oa,ma);
137.             for y=1:mb
138.                 Valice = Valice + V(:,:,b_ind(y)+1,y);
139.             end
140.             tgval = sum(max(Valice));
141.             ngval = max(ngval, tgval);
142.         end
143.     else
144.         error('NonlocalGameValue:InvalidMTYPE','MTYPE must be one of ''classical'', ''quantum'', or ''nosignal''.');
145.     end
146. end
147. 
148. % converts number "number" to base "base" with digits "digits"
149. function dits = integer_digits(number,base,digits)
150.     dits = zeros(1,digits);
151.     for i=1:digits
152.         dits(digits+1-i) = mod(number,base);
153.         number = floor(number/base);
154.     end
155. end