16.7 The JSON Format¶
MOSEK provides the possibility to read/write problems and solutions in JSON format. The official JSON website http://www.json.org provides plenty of information along with the format definition. JSON is an industry standard for data exchange and JSON files can be easily written and read in most programming languages using dedicated libraries.
MOSEK uses two JSON-based formats:
JTASK, for storing problem instances together with solutions and parameters. The JTASK format contains the same information as a native MOSEK task task format, that is a very close representation of the internal data storage in the task object.
You can write a JTASK file specifying the extension
.jtask
. When the parameterMSK_IPAR_WRITE_JSON_INDENTATION
is set the JTASK file will be indented to slightly improve readability.JSOL, for storing solutions and information items.
It is not directly accessible via Optimization Toolbox for MATLAB but only from the lower-level Optimizer API and command line tools.
16.7.1 JTASK Specification¶
The JTASK is a dictionary containing the following sections. All sections are optional and can be omitted if irrelevant for the problem.
$schema
: JSON schema.Task/name
: The name of the task (string).Task/INFO
: Information about problem data dimensions and similar. These are treated as hints when reading the file.numvar
: number of variables (int32).numcon
: number of constraints (int32).numcone
: number of cones (int32, deprecated).numbarvar
: number of symmetric matrix variables (int32).numanz
: number of nonzeros in A (int64).numsymmat
: number of matrices in the symmetric matrix storage E (int64).numafe
: number of affine expressions in AFE storage (int64).numfnz
: number of nonzeros in F (int64).numacc
: number of affine conic constraints (ACCs) (int64).numdjc
: number of disjunctive constraints (DJCs) (int64).numdom
: number of domains (int64).mosekver
: MOSEK version (list(int32)).
Task/data
: Numerical and structural data of the problem.var
: Information about variables. All fields present must have the same length asbk
. All or none ofbk
,bl
, andbu
must appear.name
: Variable names (list(string)).bk
: Bound keys (list(string)).bl
: Lower bounds (list(double)).bu
: Upper bounds (list(double)).type
: Variable types (list(string)).
con
: Information about linear constraints. All fields present must have the same length asbk
. All or none ofbk
,bl
, andbu
must appear.name
: Constraint names (list(string)).bk
: Bound keys (list(string)).bl
: Lower bounds (list(double)).bu
: Upper bounds (list(double)).
barvar
: Information about symmetric matrix variables. All fields present must have the same length asdim
.name
: Barvar names (list(string)).dim
: Dimensions (list(int32)).
objective
: Information about the objective.name
: Objective name (string).sense
: Objective sense (string).c
: The linear part \(c\) of the objective as a sparse vector. Both arrays must have the same length.subj
: indices of nonzeros (list(int32)).val
: values of nonzeros (list(double)).
cfix
: Constant term in the objective (double).Q
: The quadratic part \(Q^o\) of the objective as a sparse matrix, only lower-triangular part included. All arrays must have the same length.subi
: row indices of nonzeros (list(int32)).subj
: column indices of nonzeros (list(int32)).val
: values of nonzeros (list(double)).
barc
: The semidefinite part \(\barC\) of the objective (list). Each element of the list is a list describing one entry \(\barC_j\) using three fields:index \(j\) (int32).
weights of the matrices from the storage \(E\) forming \(\barC_j\) (list(double)).
indices of the matrices from the storage \(E\) forming \(\barC_j\) (list(int64)).
A
: The linear constraint matrix \(A\) as a sparse matrix. All arrays must have the same length.subi
: row indices of nonzeros (list(int32)).subj
: column indices of nonzeros (list(int32)).val
: values of nonzeros (list(double)).
bara
: The semidefinite part \(\barA\) of the constraints (list). Each element of the list is a list describing one entry \(\barA_{ij}\) using four fields:index \(i\) (int32).
index \(j\) (int32).
weights of the matrices from the storage \(E\) forming \(\barA_{ij}\) (list(double)).
indices of the matrices from the storage \(E\) forming \(\barA_{ij}\) (list(int64)).
AFE
: The affine expression storage.numafe
: number of rows in the storage (int64).F
: The matrix \(F\) as a sparse matrix. All arrays must have the same length.subi
: row indices of nonzeros (list(int64)).subj
: column indices of nonzeros (list(int32)).val
: values of nonzeros (list(double)).
g
: The vector \(g\) of constant terms as a sparse vector. Both arrays must have the same length.subi
: indices of nonzeros (list(int64)).val
: values of nonzeros (list(double)).
barf
: The semidefinite part \(\barF\) of the expressions in AFE storage (list). Each element of the list is a list describing one entry \(\barF_{ij}\) using four fields:index \(i\) (int64).
index \(j\) (int32).
weights of the matrices from the storage \(E\) forming \(\barF_{ij}\) (list(double)).
indices of the matrices from the storage \(E\) forming \(\barF_{ij}\) (list(int64)).
domains
: Information about domains. All fields present must have the same length astype
.name
: Domain names (list(string)).type
: Description of the type of each domain (list). Each element of the list is a list describing one domain using at least one field:domain type (string).
(except
pexp
,dexp
) dimension (int64).(only
ppow
,dpow
) weights (list(double)).
ACC
: Information about affine conic constraints (ACC). All fields present must have the same length asdomain
.name
: ACC names (list(string)).domain
: Domains (list(int64)).afeidx
: AFE indices, grouped by ACC (list(list(int64))).b
: constant vectors \(b\), grouped by ACC (list(list(double))).
DJC
: Information about disjunctive constraints (DJC). All fields present must have the same length astermsize
.name
: DJC names (list(string)).termsize
: Term sizes, grouped by DJC (list(list(int64))).domain
: Domains, grouped by DJC (list(list(int64))).afeidx
: AFE indices, grouped by DJC (list(list(int64))).b
: constant vectors \(b\), grouped by DJC (list(list(double))).
MatrixStore
: The symmetric matrix storage \(E\) (list). Each element of the list is a list describing one entry \(E\) using four fields in sparse matrix format, lower-triangular part only:dimension (int32).
row indices of nonzeros (list(int32)).
column indices of nonzeros (list(int32)).
values of nonzeros (list(double)).
Q
: The quadratic part \(Q^c\) of the constraints (list). Each element of the list is a list describing one entry \(Q^c_i\) using four fields in sparse matrix format, lower-triangular part only:the row index \(i\) (int32).
row indices of nonzeros (list(int32)).
column indices of nonzeros (list(int32)).
values of nonzeros (list(double)).
qcone
(deprecated). The description of cones. All fields present must have the same length astype
.name
: Cone names (list(string)).type
: Cone types (list(string)).par
: Additional cone parameters (list(double)).members
: Members, grouped by cone (list(list(int32))).
Task/solutions
: Solutions. This section can contain up to three subsections called:interior
basic
integer
corresponding to the three solution types in MOSEK. Each of these sections has the same structure:
prosta
: problem status (string).solsta
: solution status (string).xx
,xc
,y
,slc
,suc
,slx
,sux
,snx
: one for each component of the solution of the same name (list(double)).skx
,skc
,skn
: status keys (list(string)).doty
: the dual \(\doty\) solution, grouped by ACC (list(list(double))).barx
,bars
: the primal/dual semidefinite solution, grouped by matrix variable (list(list(double))).
Task/parameters
: Parameters.iparam
: Integer parameters (dictionary). A dictionary with entries of the formname:value
, wherename
is a shortened parameter name (without leadingMSK_IPAR_
) andvalue
is either an integer or string if the parameter takes values from an enum.dparam
: Double parameters (dictionary). A dictionary with entries of the formname:value
, wherename
is a shortened parameter name (without leadingMSK_DPAR_
) andvalue
is a double.sparam
: String parameters (dictionary). A dictionary with entries of the formname:value
, wherename
is a shortened parameter name (without leadingMSK_SPAR_
) andvalue
is a string. Note that this section is allowed but MOSEK ignores it both when writing and reading JTASK files.
16.7.2 JSOL Specification¶
The JSOL is a dictionary containing the following sections. All sections are optional and can be omitted if irrelevant for the problem.
$schema
: JSON schema.Task/name
: The name of the task (string).Task/solutions
: Solutions. This section can contain up to three subsections called:interior
basic
integer
corresponding to the three solution types in MOSEK. Each of these section has the same structure:
prosta
: problem status (string).solsta
: solution status (string).xx
,xc
,y
,slc
,suc
,slx
,sux
,snx
: one for each component of the solution of the same name (list(double)).skx
,skc
,skn
: status keys (list(string)).doty
: the dual \(\doty\) solution, grouped by ACC (list(list(double))).barx
,bars
: the primal/dual semidefinite solution, grouped by matrix variable (list(list(double))).
Task/information
: Information items from the optimizer.int32
: int32 information items (dictionary). A dictionary with entries of the formname:value
.int64
: int64 information items (dictionary). A dictionary with entries of the formname:value
.double
: double information items (dictionary). A dictionary with entries of the formname:value
.
16.7.3 A jtask
example¶
{
"$schema":"http://mosek.com/json/schema#",
"Task/name":"Markowitz portfolio with market impact",
"Task/INFO":{"numvar":7,"numcon":1,"numcone":0,"numbarvar":0,"numanz":6,"numsymmat":0,"numafe":13,"numfnz":12,"numacc":4,"numdjc":0,"numdom":3,"mosekver":[10,0,0,3]},
"Task/data":{
"var":{
"name":["1.0","x[0]","x[1]","x[2]","t[0]","t[1]","t[2]"],
"bk":["fx","lo","lo","lo","fr","fr","fr"],
"bl":[1,0.0,0.0,0.0,-1e+30,-1e+30,-1e+30],
"bu":[1,1e+30,1e+30,1e+30,1e+30,1e+30,1e+30],
"type":["cont","cont","cont","cont","cont","cont","cont"]
},
"con":{
"name":["budget[]"],
"bk":["fx"],
"bl":[1],
"bu":[1]
},
"objective":{
"sense":"max",
"name":"obj",
"c":{
"subj":[1,2,3],
"val":[0.1073,0.0737,0.0627]
},
"cfix":0.0
},
"A":{
"subi":[0,0,0,0,0,0],
"subj":[1,2,3,4,5,6],
"val":[1,1,1,0.01,0.01,0.01]
},
"AFE":{
"numafe":13,
"F":{
"subi":[1,1,1,2,2,3,4,6,7,9,10,12],
"subj":[1,2,3,2,3,3,4,1,5,2,6,3],
"val":[0.166673333200005,0.0232190712557243,0.0012599496030238,0.102863378954911,-0.00222873156550421,0.0338148677744977,1,1,1,1,1,1]
},
"g":{
"subi":[0,5,8,11],
"val":[0.035,1,1,1]
}
},
"domains":{
"type":[["r",0],
["quad",4],
["ppow",3,[0.6666666666666666,0.33333333333333337]]]
},
"ACC":{
"name":["risk[]","tz[0]","tz[1]","tz[2]"],
"domain":[1,2,2,2],
"afeidx":[[0,1,2,3],
[4,5,6],
[7,8,9],
[10,11,12]]
}
},
"Task/solutions":{
"interior":{
"prosta":"unknown",
"solsta":"unknown",
"skx":["fix","supbas","supbas","supbas","supbas","supbas","supbas"],
"skc":["fix"],
"xx":[1,0.10331580274282556,0.11673185566457132,0.7724326587076371,0.033208600335718846,0.03988270849469869,0.6788769587942524],
"xc":[1],
"slx":[0.0,-5.585840467641202e-10,-8.945844685006369e-10,-7.815248786428623e-11,0.0,0.0,0.0],
"sux":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],
"snx":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],
"slc":[0.0],
"suc":[-0.046725814048521205],
"y":[0.046725814048521205],
"doty":[[-0.6062603164682975,0.3620818321879349,0.17817754087278295,0.4524390346223723],
[-4.6725842015519993e-4,-7.708781121860897e-6,2.24800624747081e-4],
[-4.6725842015519993e-4,-9.268264309496919e-6,2.390390600079771e-4],
[-4.6725842015519993e-4,-1.5854982159992136e-4,6.159249331148646e-4]]
}
},
"Task/parameters":{
"iparam":{
"LICENSE_DEBUG":"ON",
"MIO_SEED":422
},
"dparam":{
"MIO_MAX_TIME":100
},
"sparam":{
}
}
}