std::vector getLlvmObservationSpaceList()

in compiler_gym/envs/llvm/service/ObservationSpaces.cc [27:191]


std::vector<ObservationSpace> getLlvmObservationSpaceList() {
  std::vector<ObservationSpace> spaces;
  spaces.reserve(magic_enum::enum_count<LlvmObservationSpace>());
  for (const auto& value : magic_enum::enum_values<LlvmObservationSpace>()) {
    ObservationSpace space;
    space.set_name(util::enumNameToPascalCase<LlvmObservationSpace>(value));
    switch (value) {
      case LlvmObservationSpace::IR: {
        space.mutable_string_size_range()->mutable_min()->set_value(0);
        space.set_deterministic(true);
        space.set_platform_dependent(false);
        break;
      }
      case LlvmObservationSpace::IR_SHA1: {
        space.mutable_string_size_range()->mutable_min()->set_value(40);
        space.mutable_string_size_range()->mutable_max()->set_value(40);
        space.set_deterministic(true);
        space.set_platform_dependent(false);
        break;
      }
      case LlvmObservationSpace::BITCODE: {
        space.mutable_binary_size_range()->mutable_min()->set_value(0);
        space.set_deterministic(true);
        space.set_platform_dependent(false);
        break;
      }
      case LlvmObservationSpace::BITCODE_FILE: {
        space.mutable_string_size_range()->mutable_min()->set_value(0);
        // 4096 is the maximum path length for most filesystems.
        space.mutable_string_size_range()->mutable_max()->set_value(kMaximumPathLength);
        // A random file path is generated, so the returned value is not
        // deterministic.
        space.set_deterministic(false);
        space.set_platform_dependent(false);
        break;
      }
      case LlvmObservationSpace::INST_COUNT: {
        ScalarRange featureSize;
        featureSize.mutable_min()->set_value(0);
        std::vector<ScalarRange> featureSizes(kInstCountFeatureDimensionality, featureSize);
        *space.mutable_int64_range_list()->mutable_range() = {featureSizes.begin(),
                                                              featureSizes.end()};
        space.set_deterministic(true);
        space.set_platform_dependent(false);
        std::vector<int64_t> defaultValue(kInstCountFeatureDimensionality, 0);
        *space.mutable_default_value()->mutable_int64_list()->mutable_value() = {
            defaultValue.begin(), defaultValue.end()};
        break;
      }
      case LlvmObservationSpace::AUTOPHASE: {
        ScalarRange featureSize;
        featureSize.mutable_min()->set_value(0);
        std::vector<ScalarRange> featureSizes;
        featureSizes.reserve(kAutophaseFeatureDim);
        for (size_t i = 0; i < kAutophaseFeatureDim; ++i) {
          featureSizes.push_back(featureSize);
        }
        *space.mutable_int64_range_list()->mutable_range() = {featureSizes.begin(),
                                                              featureSizes.end()};
        space.set_deterministic(true);
        space.set_platform_dependent(false);
        std::vector<int64_t> defaultValue(kAutophaseFeatureDim, 0);
        *space.mutable_default_value()->mutable_int64_list()->mutable_value() = {
            defaultValue.begin(), defaultValue.end()};
        break;
      }
      case LlvmObservationSpace::PROGRAML: {
        // ProGraML serializes the graph to JSON.
        space.set_opaque_data_format("json://networkx/MultiDiGraph");
        space.mutable_string_size_range()->mutable_min()->set_value(0);
        space.set_deterministic(true);
        space.set_platform_dependent(false);
        programl::ProgramGraph graph;
        json nodeLinkGraph;
        CHECK(programl::graph::format::ProgramGraphToNodeLinkGraph(graph, &nodeLinkGraph).ok())
            << "Failed to serialize default ProGraML graph";
        *space.mutable_default_value()->mutable_string_value() = nodeLinkGraph.dump();
        break;
      }
      case LlvmObservationSpace::PROGRAML_JSON: {
        // ProGraML serializes the graph to JSON.
        space.set_opaque_data_format("json://");
        space.mutable_string_size_range()->mutable_min()->set_value(0);
        space.set_deterministic(true);
        space.set_platform_dependent(false);
        programl::ProgramGraph graph;
        json nodeLinkGraph;
        CHECK(programl::graph::format::ProgramGraphToNodeLinkGraph(graph, &nodeLinkGraph).ok())
            << "Failed to serialize default ProGraML graph";
        *space.mutable_default_value()->mutable_string_value() = nodeLinkGraph.dump();
        break;
      }
      case LlvmObservationSpace::CPU_INFO: {
        // Hardware info is returned as a JSON
        space.set_opaque_data_format("json://");
        space.mutable_string_size_range()->mutable_min()->set_value(0);
        space.set_deterministic(true);
        space.set_platform_dependent(true);
        *space.mutable_default_value()->mutable_string_value() = "{}";
        break;
      }
      case LlvmObservationSpace::IR_INSTRUCTION_COUNT:
      case LlvmObservationSpace::IR_INSTRUCTION_COUNT_O0:
      case LlvmObservationSpace::IR_INSTRUCTION_COUNT_O3:
      case LlvmObservationSpace::IR_INSTRUCTION_COUNT_OZ: {
        auto featureSize = space.mutable_scalar_int64_range();
        featureSize->mutable_min()->set_value(0);
        space.set_deterministic(true);
        space.set_platform_dependent(false);
        space.mutable_default_value()->set_scalar_int64(0);
        break;
      }
      case LlvmObservationSpace::OBJECT_TEXT_SIZE_BYTES:
      case LlvmObservationSpace::OBJECT_TEXT_SIZE_O0:
      case LlvmObservationSpace::OBJECT_TEXT_SIZE_O3:
      case LlvmObservationSpace::OBJECT_TEXT_SIZE_OZ: {
        auto featureSize = space.mutable_scalar_int64_range();
        featureSize->mutable_min()->set_value(0);
        space.set_deterministic(true);
        space.set_platform_dependent(true);
        space.mutable_default_value()->set_scalar_int64(0);
        break;
      }
#ifdef COMPILER_GYM_EXPERIMENTAL_TEXT_SIZE_COST
      case LlvmObservationSpace::TEXT_SIZE_BYTES:
      case LlvmObservationSpace::TEXT_SIZE_O0:
      case LlvmObservationSpace::TEXT_SIZE_O3:
      case LlvmObservationSpace::TEXT_SIZE_OZ: {
        auto featureSize = space.mutable_scalar_int64_range();
        featureSize->mutable_min()->set_value(0);
        space.set_deterministic(true);
        space.set_platform_dependent(true);
        space.mutable_default_value()->set_scalar_int64(0);
        break;
      }
#endif
      case LlvmObservationSpace::RUNTIME: {
        space.mutable_double_sequence()->mutable_length_range()->mutable_min()->set_value(0);
        space.mutable_double_sequence()->mutable_scalar_range()->mutable_min()->set_value(0);
        space.set_deterministic(false);
        space.set_platform_dependent(true);
        break;
      }
      case LlvmObservationSpace::BUILDTIME: {
        space.mutable_double_sequence()->mutable_length_range()->mutable_min()->set_value(0);
        space.mutable_double_sequence()->mutable_scalar_range()->mutable_min()->set_value(0);
        space.set_deterministic(false);
        space.set_platform_dependent(true);
        break;
      }
      case LlvmObservationSpace::IS_BUILDABLE:
      case LlvmObservationSpace::IS_RUNNABLE: {
        auto featureSize = space.mutable_scalar_int64_range();
        featureSize->mutable_min()->set_value(0);
        featureSize->mutable_max()->set_value(1);
        space.set_deterministic(true);
        space.set_platform_dependent(true);
        space.mutable_default_value()->set_scalar_int64(0);
        break;
      }
    }
    spaces.push_back(space);
  }
  return spaces;
}