Configuration System

The qubots framework uses a comprehensive configuration system based on config.json files that define solver parameters, metadata, and integration settings. This system ensures consistent parameter handling across the framework, Rastion playground interface, and leaderboard submissions.

Overview

Every qubots repository must contain a config.json file that serves multiple purposes:

  • Parameter Definition: Specifies all configurable parameters with types, defaults, and validation rules
  • Metadata: Provides descriptive information about the solver or problem
  • Integration: Enables seamless integration with Rastion playground and leaderboard systems
  • Validation: Ensures parameter values are within acceptable ranges and types

Basic Structure

Minimal Configuration

{
  "type": "optimizer",
  "entry_point": "qubot",
  "class_name": "MyOptimizer",
  "default_params": {
    "time_limit": 60.0,
    "population_size": 50
  },
  "metadata": {
    "name": "My Optimizer",
    "description": "A simple optimization algorithm"
  }
}

Complete Configuration Schema

{
  "type": "optimizer|problem",
  "entry_point": "qubot",
  "class_name": "ClassName",
  "default_params": {
    "param1": "default_value1",
    "param2": "default_value2"
  },
  "parameters": {
    "param1": {
      "type": "string|number|integer|boolean|array",
      "default": "default_value",
      "description": "Parameter description",
      "min": 0,
      "max": 100,
      "options": ["option1", "option2"],
      "required": true
    }
  },
  "metadata": {
    "name": "Display Name",
    "description": "Detailed description",
    "domain": "optimization_domain",
    "tags": ["tag1", "tag2"],
    "difficulty": "beginner|intermediate|advanced",
    "optimizer_type": "exact|metaheuristic|hybrid",
    "problem_type": "combinatorial|continuous|mixed"
  },
  "requirements": [
    "qubots",
    "numpy>=1.20.0"
  ]
}

Parameter Types and Validation

Supported Parameter Types

String Parameters

{
  "algorithm_type": {
    "type": "string",
    "default": "genetic",
    "options": ["genetic", "simulated_annealing", "tabu_search"],
    "description": "Type of optimization algorithm to use"
  }
}

Numeric Parameters

{
  "time_limit": {
    "type": "number",
    "default": 60.0,
    "min": 1.0,
    "max": 3600.0,
    "step": 0.1,
    "description": "Maximum optimization time in seconds"
  },
  "population_size": {
    "type": "integer",
    "default": 50,
    "min": 10,
    "max": 1000,
    "description": "Number of individuals in the population"
  }
}

Boolean Parameters

{
  "use_elitism": {
    "type": "boolean",
    "default": true,
    "description": "Whether to preserve best solutions across generations"
  }
}

Array Parameters

{
  "weight_range": {
    "type": "array",
    "default": [1.0, 10.0],
    "description": "Range for random edge weights [min, max]",
    "items": {
      "type": "number",
      "min": 0.1,
      "max": 100.0
    },
    "minItems": 2,
    "maxItems": 2
  }
}

Parameter Validation Rules

Required vs Optional Parameters

{
  "parameters": {
    "time_limit": {
      "type": "number",
      "default": 60.0,
      "required": true,
      "description": "Maximum solving time (required)"
    },
    "log_level": {
      "type": "integer",
      "default": 1,
      "required": false,
      "description": "Logging verbosity (optional)"
    }
  }
}

Range Constraints

{
  "mutation_rate": {
    "type": "number",
    "default": 0.1,
    "min": 0.001,
    "max": 1.0,
    "description": "Mutation probability (0.001 to 1.0)"
  }
}

Enumerated Options

{
  "selection_method": {
    "type": "string",
    "default": "tournament",
    "options": ["tournament", "roulette", "rank", "random"],
    "description": "Selection method for genetic algorithm"
  }
}

Rastion Playground Integration

Parameter Display

The Rastion playground automatically generates UI controls based on parameter definitions:

{
  "parameters": {
    "population_size": {
      "type": "integer",
      "default": 50,
      "min": 10,
      "max": 500,
      "description": "Population size for genetic algorithm"
    }
  }
}

This creates:

  • A numeric input field with min/max validation
  • Range display showing (10-500)
  • Tooltip with the description
  • Default value pre-filled

Parameter Categories

Group related parameters for better UI organization:

{
  "parameters": {
    "population_size": {
      "type": "integer",
      "default": 50,
      "category": "Algorithm",
      "description": "Population size"
    },
    "time_limit": {
      "type": "number", 
      "default": 60.0,
      "category": "Execution",
      "description": "Time limit in seconds"
    }
  }
}

Best Practices

1. Comprehensive Parameter Documentation

Always provide clear, detailed descriptions:

{
  "crossover_rate": {
    "type": "number",
    "default": 0.8,
    "min": 0.0,
    "max": 1.0,
    "description": "Probability of crossover between parent solutions. Higher values increase exploration but may reduce convergence speed."
  }
}

2. Sensible Default Values

Choose defaults that work well for typical problems:

{
  "default_params": {
    "population_size": 50,     // Good balance of diversity and speed
    "generations": 100,        // Sufficient for convergence
    "mutation_rate": 0.1,      // Conservative mutation rate
    "crossover_rate": 0.8      // High crossover for exploration
  }
}

3. Appropriate Validation Ranges

Set realistic bounds based on algorithm requirements:

{
  "temperature": {
    "type": "number",
    "default": 100.0,
    "min": 0.1,               // Prevent division by zero
    "max": 10000.0,           // Reasonable upper bound
    "description": "Initial temperature for simulated annealing"
  }
}

4. Consistent Naming Conventions

Use clear, consistent parameter names:

{
  "time_limit": 60.0,         // Not "max_time" or "timeout"
  "population_size": 50,      // Not "pop_size" or "num_individuals"
  "mutation_rate": 0.1        // Not "mut_prob" or "mutation_probability"
}

Template Configurations

Genetic Algorithm Template

{
  "type": "optimizer",
  "entry_point": "qubot",
  "class_name": "GeneticAlgorithm",
  "default_params": {
    "population_size": 50,
    "generations": 100,
    "crossover_rate": 0.8,
    "mutation_rate": 0.1,
    "elite_size": 5,
    "tournament_size": 3
  },
  "parameters": {
    "population_size": {
      "type": "integer",
      "default": 50,
      "min": 10,
      "max": 500,
      "description": "Number of individuals in the population"
    },
    "generations": {
      "type": "integer", 
      "default": 100,
      "min": 10,
      "max": 1000,
      "description": "Number of generations to evolve"
    },
    "crossover_rate": {
      "type": "number",
      "default": 0.8,
      "min": 0.0,
      "max": 1.0,
      "description": "Probability of crossover between parents"
    },
    "mutation_rate": {
      "type": "number",
      "default": 0.1,
      "min": 0.001,
      "max": 1.0,
      "description": "Probability of mutation for each gene"
    }
  },
  "metadata": {
    "name": "Genetic Algorithm",
    "description": "Evolutionary optimization algorithm",
    "domain": "general",
    "tags": ["genetic", "evolutionary", "metaheuristic"],
    "difficulty": "intermediate",
    "optimizer_type": "metaheuristic"
  }
}

Exact Solver Template

{
  "type": "optimizer",
  "entry_point": "qubot", 
  "class_name": "ExactSolver",
  "default_params": {
    "time_limit": 300.0,
    "mip_gap": 0.01,
    "presolve": true,
    "parallel": true
  },
  "parameters": {
    "time_limit": {
      "type": "number",
      "default": 300.0,
      "min": 1.0,
      "max": 3600.0,
      "description": "Maximum solving time in seconds"
    },
    "mip_gap": {
      "type": "number",
      "default": 0.01,
      "min": 0.0001,
      "max": 0.5,
      "description": "Relative optimality gap tolerance"
    },
    "presolve": {
      "type": "boolean",
      "default": true,
      "description": "Enable preprocessing to simplify the problem"
    }
  },
  "metadata": {
    "name": "Exact Solver",
    "description": "Mathematical programming solver",
    "optimizer_type": "exact"
  }
}

Next Steps