{
 "$schema": "http://json-schema.org/draft-07/schema",
 "$id": "https://github.com/fjosw/pyerrors/tree/develop/examples/json_schema.json",
 "type": "object",
 "title": "pyerrors JSON file format",
 "description": "Schema to validate JSON files according to the pyerrors file format 1.0.",
 "required": [
  "obsdata"
 ],
 "optional": [
  "program",
  "version",
  "who",
  "date",
  "host",
  "description"
 ],
 "properties": {
  "program": {
   "type": "string",
   "description": "The program that was used to write the file",
   "examples": [
    "pyerrors"
   ]
  },
  "version": {
   "type": "string",
   "description": "The version of the file format.",
   "examples": [
    "1.0"
   ]
  },
  "who": {
   "type": "string",
   "description": "The username of the creator of this file."
  },
  "date": {
   "type": "string",
   "description": "Date, when this file has been written.",
   "examples": [
    "2021-11-29 09:55:05"
   ]
  },
  "host": {
   "type": "string",
   "description": "Hostname of the machine where the file has been written."
  },
  "description": {
   "type": ["number","string","boolean","object","array","null"],
   "description": "A description of the content of the file."
  },
  "obsdata": {
   "type": "array",
   "description": "Contains the actual data. One entry per structure. A structure is either a single Obs or a one-dimensional representation of a multi-dimensional object (list, array, Corr). Each Obs inside a structure has to be defined on the same set of configs.",
   "items": {
    "$ref": "#/$defs/obsdata_items"
   }
  }
 },
 "$defs": {
  "obsdata_items": {
   "type": "object",
   "description": "Contains the information for one structure of Observables.",
   "required": [
    "type",
    "value"
   ],
   "optional": [
    "layout",
    "tag",
    "reweighted",
    "data",
    "cdata"
   ],
   "properties": {
    "type": {
     "type": "string",
     "description": "Specifies the type of the structure, needed for the correct parsing of flattened structures.",
     "examples": [
      "Obs", "List", "Array", "Corr"
     ]
    },
    "layout": {
     "type": "string",
     "description": "The layout of the structure. One entry per dimension, separated by commas",
     "default": "1",
     "examples": [
      "1", "1, 2", "2, 2, 4"
     ]
    },
    "value": {
     "type": "array",
     "description": "The mean values of all Obs inside the structure.",
     "examples": [
      [1.2],
      [2.3, 2.1, 3.1]
     ],
     "items": [{
      "type": "number",
      "description": "A mean value of an Obs."
     }]
    },
    "tag": {
     "type": ["number","string","boolean","object","array","null"],
     "description": "Optional descriptor of the structure."
    },
    "reweighted": {
     "type": "boolean",
     "description": "May be used to specify whether the Obs inside the structure have been reweighted."
    },
    "data": {
     "type": "array",
     "description": "Contains the data for each ensemble.",
     "items": {
      "$ref": "#/$defs/ensdata_items"
     }
    },
    "cdata": {
     "type": "array",
     "description": "Contains the data for each covariance matrix.",
     "items": {
      "$ref": "#/$defs/cdata_items"
     }
    }
   }
  },
  "ensdata_items": {
   "type": "object",
   "description": "The data for one single ensemble",
   "required": [
    "id",
    "replica"
   ],
   "properties": {
    "id": {
     "type": "string",
     "description": "The id of the ensemble"
    },
    "replica": {
     "type": "array",
     "description": "Contains the data for each replica of the ensemble.",
     "items": {
      "$ref": "#/$defs/repdata_items"
     }
    }
   }
  },

  "repdata_items": {
   "type": "object",
   "description": "The data for one single replica",
   "required": [
    "name",
    "deltas"
   ],
   "properties": {
    "name": {
     "type": "string",
     "description": "The name of the replica."
    },
    "deltas": {
     "type": "array",
     "description": "The actual data: Contains configuration numbers and the deltas, i.e., the deviations from the mean value, for each Obs inside the structure.",
     "items": {
      "$ref": "#/$defs/deltas_items"
     }
    }
   }
  },

  "deltas_items": {
   "type": "array",
   "description": "First entry is the configuration number. Each further entry is the delta, i.e., the deviation from the mean value, for one Obs inside the structure.",
   "prefixItems": [{
    "type": "integer"
   }],
   "items": [{
    "type": "number"
   }]
  },

  "cdata_items": {
   "type": "object",
   "description": "Contains the data for one covariance matrix.",
   "required": [
    "id",
    "layout",
    "cov",
    "grad"
   ],
   "properties": {
    "id": {
     "type": "string",
     "description": "The identifier of the covariance matrix."
    },
    "layout": {
     "type": "string",
     "description": "The layout of the NxN covariance matrix",
     "examples": [
      "1, 1", "2, 2"
     ]
    },
    "cov": {
     "type": "array",
     "description": "Contains the NxN covariance matrix, stored in row-major format.",
     "items": [{
      "type": "number"
     }]
    },
    "grad": {
     "type": "array",
     "description": "The gradient of all Obs inside the structure with respect to the corresponding (diagonal) elements of the covariance matrix.",
     "items": [{
      "type": "array",
      "description": "The gradient of all Obs with respect to the Ith element of the covariance matrix, where I is the position of this array inside grad.",
      "items": [{
       "type": "number"
      }]
     }]
    }
   }
  }
 },
 "examples": [
    {
   "program": "pyerrors 2.0.0+dev",
   "version": "1.0",
   "who": "s-kuberski",
   "date": "2022-02-16 12:59:09 +0100",
   "host": "Hostname",
   "obsdata": [
    {
     "type": "Obs",
     "layout": "1",
     "value": [
      1.0
     ],
     "data": [
      {
       "id": "A",
       "replica": [
        {
         "name": "A|r1",
         "deltas": [
          [1, -4.579833517667820e-02],
          [2, 1.272532469141094e-01],
          [3, -7.042514710393744e-02],
          [4, -4.800967024769492e-01],
          [5, 2.967284377711763e-01],
          [6, 3.156118966788146e-01],
          [7, 1.139599354351861e-02],
          [8, -1.546693901500542e-01]
         ]
        },
        {
         "name": "A|r2",
         "deltas": [
          [1, 2.003189752235817e-01],
          [2, 1.456782186748891e-01],
          [3, -2.417953154609670e-01],
          [4, 1.112557347812830e-01],
          [5, -6.889549539458262e-02],
          [6, 2.984543471692340e-01],
          [7, -4.874803852180309e-01],
          [8, 4.246392022459267e-02]
         ]
        }
       ]
      },
      {
       "id": "B",
       "replica": [
        {
         "name": "B|r1",
         "deltas": [
          [1, -2.726195322210824e-01],
          [2, 3.949288132215630e-01],
          [3, -2.832514721110847e-01],
          [4, -8.371015800402004e-02],
          [5, 2.643463355004773e-01],
          [6, -2.265154600267616e-02],
          [7, -1.954084091845127e-01],
          [8, 1.983659688013363e-01]
         ]
        }
       ]
      }
     ],
     "cdata": [
      {
       "id": "#renorm",
       "layout": "2, 2",
       "cov": [1.000000000000000e-01, 5.000000000000000e-02, 5.000000000000000e-02, 2.000000000000000e-02],
       "grad": [
        [1.000000000000000e+00],
        [0.000000000000000e+00]
       ]
      }
     ]
    },
    {
     "type": "List",
     "layout": "2",
     "value": [
      1.2,
      0.8333333333333334
     ],
     "data": [
      {
       "id": "B",
       "replica": [
        {
         "name": "B|r1",
         "deltas": [
          [1, 2.368958758731594e-01, 1.645110249119163e-01],
          [2, 3.164596213857241e-01, 2.197636259623084e-01],
          [3, -2.422021289001151e-01, -1.681959228473022e-01],
          [4, 1.365207560473117e-01, 9.480608058841092e-02],
          [5, -1.958565486752142e-02, -1.360114921355654e-02],
          [6, -6.335145310374894e-01, -4.399406465538122e-01],
          [7, 1.945374561549609e-02, 1.350954556631673e-02],
          [8, 1.859723158834354e-01, 1.291474415857190e-01]
         ]
        }
       ]
      }
     ],
     "cdata": [
      {
       "id": "renorm",
       "layout": "2, 2",
       "cov": [1.000000000000000e-01, 5.000000000000000e-02, 5.000000000000000e-02, 2.000000000000000e-02],
       "grad": [
        [1.000000000000000e+00, -6.944444444444444e-01],
        [0.000000000000000e+00, 0.000000000000000e+00]
       ]
      }
     ]
    }
   ]
  }
 ]
}
