{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
        "migration": {
            "type": "object",
            "properties": {
                "nbCandidatMigration": {
                    "type": "integer",
                    "minimum": 0
                },
                "stepMigration": {
                    "type": "integer",
                    "minimum": 0
                }
            },
            "required": [
                "nbCandidatMigration",
                "stepMigration"
            ]
        },
        "name": {
            "type": "string",
            "minLength": 1
        },
        "dataFile": {
            "type": "string",
            "minLength": 1
        },
        "tabAlgoGen": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "minimum": 0
                    },
                    "initParam": {
                        "type": "object",
                        "properties": {
                            "taillePop": {
                                "type": "integer",
                                "minimum": 0
                            },
                            "nbGeneration": {
                                "type": "integer",
                                "minimum": 0
                            },
                            "probaCroisement": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 1
                            },
                            "probaMutation": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 1
                            },
                            "tabProbaMigration": {
                                "type": "array",
                                "items": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 1
                                }
                            },
                            "classUsed": {
                                "type": "object",
                                "properties": {
                                    "typeInd": {
                                        "type": "object",
                                        "properties": {
                                            "class": {
                                                "enum": [
                                                    "itemset",
                                                    "itemsetO"
                                                ]
                                            },
                                            "typePrimitif": {
                                                "enum": [
                                                    "char"
                                                ]
                                            }
                                        },
                                        "required": [
                                            "class",
                                            "typePrimitif"
                                        ]
                                    },
                                    "populate": {
                                        "type": "object",
                                        "properties": {
                                            "class": {
                                                "enum": [
                                                    "randPop",
                                                    "freqPop",
                                                    "irandPop"
                                                ]
                                            }
                                        },
                                        "required": [
                                            "class"
                                        ]
                                    },
                                    "evaluate": {
                                        "type": "object",
                                        "properties": {
                                            "class": {
                                                "enum": [
                                                    "freqEval",
                                                    "closeEval"
                                                ]
                                            }
                                        },
                                        "required": [
                                            "class"
                                        ]
                                    },
                                    "crossover": {
                                        "type": "object",
                                        "properties": {
                                            "class": {
                                                "enum": [
                                                    "monoPCross",
                                                    "multiPCross",
                                                    "uCross"
                                                ]
                                            }
                                        },
                                        "required": [
                                            "class"
                                        ]
                                    },
                                    "mutator": {
                                        "type": "object",
                                        "properties": {
                                            "class": {
                                                "enum": [
                                                    "randMut"
                                                ]
                                            }
                                        },
                                        "required": [
                                            "class"
                                        ]
                                    },
                                    "selectPolicy": {
                                        "type": "object",
                                        "properties": {
                                            "class": {
                                                "enum": [
                                                    "bestS",
                                                    "randS",
                                                    "tournamentS"
                                                ]
                                            }
                                        },
                                        "required": [
                                            "class"
                                        ]
                                    },
                                    "indelPolicy": {
                                        "type": "object",
                                        "properties": {
                                            "class": {
                                                "enum": [
                                                    "fitnessID",
                                                    "ageID"
                                                ]
                                            }
                                        },
                                        "required": [
                                            "class"
                                        ]
                                    },
                                    "selectPolicyMigrate": {
                                        "type": "object",
                                        "properties": {
                                            "class": {
                                                "enum": [
                                                    "bestMig",
                                                    "tournamentMig"
                                                ]
                                            }
                                        },
                                        "required": [
                                            "class"
                                        ]
                                    },
                                    "indelPolicyMigrate": {
                                        "type": "object",
                                        "properties": {
                                            "class": {
                                                "enum": [
                                                    "oldestIDMig",
                                                    "worstIDMig"
                                                ]
                                            }
                                        },
                                        "required": [
                                            "class"
                                        ]
                                    }
                                },
                                "required": [
                                    "typeInd",
                                    "populate",
                                    "evaluate",
                                    "crossover",
                                    "mutator",
                                    "selectPolicy",
                                    "indelPolicy",
                                    "selectPolicyMigrate",
                                    "indelPolicyMigrate"
                                ]
                            }
                        },
                        "required": [
                            "taillePop",
                            "nbGeneration",
                            "probaCroisement",
                            "probaMutation",
                            "tabProbaMigration",
                            "classUsed"
                        ]
                    },
                    "resultFile": {
                        "type": "string",
                        "minLength": 1
                    }
                },
                "required": [
                    "id",
                    "initParam",
                    "resultFile"
                ]
            },
            "minItems": 1
        }
    },
    "required": [
        "migration",
        "name",
        "dataFile",
        "tabAlgoGen"
    ]
}