Author: Eric Christopher Date: 2020-09-18T14:47:43-07:00 New Revision: 549e55b3d5634870aa9d42135f51ad46a6a0e347
URL: https://github.com/llvm/llvm-project/commit/549e55b3d5634870aa9d42135f51ad46a6a0e347 DIFF: https://github.com/llvm/llvm-project/commit/549e55b3d5634870aa9d42135f51ad46a6a0e347.diff LOG: Temporarily Revert "[clangd] Add Random Forest runtime for code completion." as a header doesn't appear to have made it into the commit. This reverts commit 9b6765e784b39c88cb8cdb85ab083e6c95a997ed and followup Added: Modified: clang-tools-extra/clangd/CMakeLists.txt clang-tools-extra/clangd/unittests/CMakeLists.txt clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp Removed: clang-tools-extra/clangd/quality/CompletionModel.cmake clang-tools-extra/clangd/quality/CompletionModelCodegen.py clang-tools-extra/clangd/quality/README.md clang-tools-extra/clangd/quality/model/features.json clang-tools-extra/clangd/quality/model/forest.json clang-tools-extra/clangd/unittests/DecisionForestTests.cpp clang-tools-extra/clangd/unittests/decision_forest_model/CategoricalFeature.h clang-tools-extra/clangd/unittests/decision_forest_model/features.json clang-tools-extra/clangd/unittests/decision_forest_model/forest.json ################################################################################ diff --git a/clang-tools-extra/clangd/CMakeLists.txt b/clang-tools-extra/clangd/CMakeLists.txt index 9d2ab5be222a..3a1a034ed17b 100644 --- a/clang-tools-extra/clangd/CMakeLists.txt +++ b/clang-tools-extra/clangd/CMakeLists.txt @@ -28,9 +28,6 @@ set(LLVM_LINK_COMPONENTS FrontendOpenMP Option ) - -include(${CMAKE_CURRENT_SOURCE_DIR}/quality/CompletionModel.cmake) -gen_decision_forest(${CMAKE_CURRENT_SOURCE_DIR}/quality/model CompletionModel clang::clangd::Example) if(MSVC AND NOT CLANG_CL) set_source_files_properties(CompileCommands.cpp PROPERTIES COMPILE_FLAGS -wd4130) # disables C4130: logical operation on address of string constant @@ -80,7 +77,6 @@ add_clang_library(clangDaemon TUScheduler.cpp URI.cpp XRefs.cpp - ${CMAKE_CURRENT_BINARY_DIR}/CompletionModel.cpp index/Background.cpp index/BackgroundIndexLoader.cpp @@ -121,11 +117,6 @@ add_clang_library(clangDaemon omp_gen ) -# Include generated CompletionModel headers. -target_include_directories(clangDaemon PUBLIC - $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}> -) - clang_target_link_libraries(clangDaemon PRIVATE clangAST diff --git a/clang-tools-extra/clangd/quality/CompletionModel.cmake b/clang-tools-extra/clangd/quality/CompletionModel.cmake deleted file mode 100644 index 60c6d2aa8433..000000000000 --- a/clang-tools-extra/clangd/quality/CompletionModel.cmake +++ /dev/null @@ -1,37 +0,0 @@ -# Run the Completion Model Codegenerator on the model present in the -# ${model} directory. -# Produces a pair of files called ${filename}.h and ${filename}.cpp in the -# ${CMAKE_CURRENT_BINARY_DIR}. The generated header -# will define a C++ class called ${cpp_class} - which may be a -# namespace-qualified class name. -function(gen_decision_forest model filename cpp_class) - set(model_compiler ${CMAKE_SOURCE_DIR}/../clang-tools-extra/clangd/quality/CompletionModelCodegen.py) - - set(output_dir ${CMAKE_CURRENT_BINARY_DIR}) - set(header_file ${output_dir}/${filename}.h) - set(cpp_file ${output_dir}/${filename}.cpp) - - add_custom_command(OUTPUT ${header_file} ${cpp_file} - COMMAND "${Python3_EXECUTABLE}" ${model_compiler} - --model ${model} - --output_dir ${output_dir} - --filename ${filename} - --cpp_class ${cpp_class} - COMMENT "Generating code completion model runtime..." - DEPENDS ${model_compiler} ${model}/forest.json ${model}/features.json - VERBATIM ) - - set_source_files_properties(${header_file} PROPERTIES - GENERATED 1) - set_source_files_properties(${cpp_file} PROPERTIES - GENERATED 1) - - # Disable unused label warning for generated files. - if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - set_source_files_properties(${cpp_file} PROPERTIES - COMPILE_FLAGS /wd4102) - else() - set_source_files_properties(${cpp_file} PROPERTIES - COMPILE_FLAGS -Wno-unused) - endif() -endfunction() diff --git a/clang-tools-extra/clangd/quality/CompletionModelCodegen.py b/clang-tools-extra/clangd/quality/CompletionModelCodegen.py deleted file mode 100644 index 20bfccd8806f..000000000000 --- a/clang-tools-extra/clangd/quality/CompletionModelCodegen.py +++ /dev/null @@ -1,290 +0,0 @@ -"""Code generator for Code Completion Model Inference. - -Tool runs on the Decision Forest model defined in {model} directory. -It generates two files: {output_dir}/{filename}.h and {output_dir}/{filename}.cpp -The generated files defines the Example class named {cpp_class} having all the features as class members. -The generated runtime provides an `Evaluate` function which can be used to score a code completion candidate. -""" - -import argparse -import json -import struct - - -class CppClass: - """Holds class name and names of the enclosing namespaces.""" - - def __init__(self, cpp_class): - ns_and_class = cpp_class.split("::") - self.ns = [ns for ns in ns_and_class[0:-1] if len(ns) > 0] - self.name = ns_and_class[-1] - if len(self.name) == 0: - raise ValueError("Empty class name.") - - def ns_begin(self): - """Returns snippet for opening namespace declarations.""" - open_ns = ["namespace %s {" % ns for ns in self.ns] - return "\n".join(open_ns) - - def ns_end(self): - """Returns snippet for closing namespace declarations.""" - close_ns = [ - "} // namespace %s" % ns for ns in reversed(self.ns)] - return "\n".join(close_ns) - - -def header_guard(filename): - '''Returns the header guard for the generated header.''' - return "GENERATED_DECISION_FOREST_MODEL_%s_H" % filename.upper() - - -def boost_node(n, label, next_label): - """Returns code snippet for a leaf/boost node. - Adds value of leaf to the score and jumps to the root of the next tree.""" - return "%s: Score += %s; goto %s;" % ( - label, n['score'], next_label) - - -def if_greater_node(n, label, next_label): - """Returns code snippet for a if_greater node. - Jumps to true_label if the Example feature (NUMBER) is greater than the threshold. - Comparing integers is much faster than comparing floats. Assuming floating points - are represented as IEEE 754, it order-encodes the floats to integers before comparing them. - Control falls through if condition is evaluated to false.""" - threshold = n["threshold"] - return "%s: if (E.%s >= %s /*%s*/) goto %s;" % ( - label, n['feature'], order_encode(threshold), threshold, next_label) - - -def if_member_node(n, label, next_label): - """Returns code snippet for a if_member node. - Jumps to true_label if the Example feature (ENUM) is present in the set of enum values - described in the node. - Control falls through if condition is evaluated to false.""" - members = '|'.join([ - "BIT(%s_type::%s)" % (n['feature'], member) - for member in n["set"] - ]) - return "%s: if (E.%s & (%s)) goto %s;" % ( - label, n['feature'], members, next_label) - - -def node(n, label, next_label): - """Returns code snippet for the node.""" - return { - 'boost': boost_node, - 'if_greater': if_greater_node, - 'if_member': if_member_node, - }[n['operation']](n, label, next_label) - - -def tree(t, tree_num, node_num): - """Returns code for inferencing a Decision Tree. - Also returns the size of the decision tree. - - A tree starts with its label `t{tree#}`. - A node of the tree starts with label `t{tree#}_n{node#}`. - - The tree contains two types of node: Conditional node and Leaf node. - - Conditional node evaluates a condition. If true, it jumps to the true node/child. - Code is generated using pre-order traversal of the tree considering - false node as the first child. Therefore the false node is always the - immediately next label. - - Leaf node adds the value to the score and jumps to the next tree. - """ - label = "t%d_n%d" % (tree_num, node_num) - code = [] - if node_num == 0: - code.append("t%d:" % tree_num) - - if t["operation"] == "boost": - code.append(node(t, label=label, next_label="t%d" % (tree_num + 1))) - return code, 1 - - false_code, false_size = tree( - t['else'], tree_num=tree_num, node_num=node_num+1) - - true_node_num = node_num+false_size+1 - true_label = "t%d_n%d" % (tree_num, true_node_num) - - true_code, true_size = tree( - t['then'], tree_num=tree_num, node_num=true_node_num) - - code.append(node(t, label=label, next_label=true_label)) - - return code+false_code+true_code, 1+false_size+true_size - - -def gen_header_code(features_json, cpp_class, filename): - """Returns code for header declaring the inference runtime. - - Declares the Example class named {cpp_class} inside relevant namespaces. - The Example class contains all the features as class members. This - class can be used to represent a code completion candidate. - Provides `float Evaluate()` function which can be used to score the Example. - """ - setters = [] - for f in features_json: - feature = f["name"] - if f["kind"] == "NUMBER": - # Floats are order-encoded to integers for faster comparison. - setters.append( - "void set%s(float V) { %s = OrderEncode(V); }" % ( - feature, feature)) - elif f["kind"] == "ENUM": - setters.append( - "void set%s(unsigned V) { %s = 1 << V; }" % (feature, feature)) - else: - raise ValueError("Unhandled feature type.", f["kind"]) - - # Class members represent all the features of the Example. - class_members = ["uint32_t %s = 0;" % f['name'] for f in features_json] - - nline = "\n " - guard = header_guard(filename) - return """#ifndef %s -#define %s -#include <cstdint> - -%s -class %s { -public: - %s - -private: - %s - - // Produces an integer that sorts in the same order as F. - // That is: a < b <==> orderEncode(a) < orderEncode(b). - static uint32_t OrderEncode(float F); - friend float Evaluate(const %s&); -}; - -float Evaluate(const %s&); -%s -#endif // %s -""" % (guard, guard, cpp_class.ns_begin(), cpp_class.name, nline.join(setters), - nline.join(class_members), cpp_class.name, cpp_class.name, - cpp_class.ns_end(), guard) - - -def order_encode(v): - i = struct.unpack('<I', struct.pack('<f', v))[0] - TopBit = 1 << 31 - # IEEE 754 floats compare like sign-magnitude integers. - if (i & TopBit): # Negative float - return (1 << 32) - i # low half of integers, order reversed. - return TopBit + i # top half of integers - - -def evaluate_func(forest_json, cpp_class): - """Generates code for `float Evaluate(const {Example}&)` function. - The generated function can be used to score an Example.""" - code = "float Evaluate(const %s& E) {\n" % cpp_class.name - lines = [] - lines.append("float Score = 0;") - tree_num = 0 - for tree_json in forest_json: - lines.extend(tree(tree_json, tree_num=tree_num, node_num=0)[0]) - lines.append("") - tree_num += 1 - - lines.append("t%s: // No such tree." % len(forest_json)) - lines.append("return Score;") - code += " " + "\n ".join(lines) - code += "\n}" - return code - - -def gen_cpp_code(forest_json, features_json, filename, cpp_class): - """Generates code for the .cpp file.""" - # Headers - # Required by OrderEncode(float F). - angled_include = [ - '#include <%s>' % h - for h in ["cstring", "limits"] - ] - - # Include generated header. - qouted_headers = {filename + '.h', 'llvm/ADT/bit.h'} - # Headers required by ENUM features used by the model. - qouted_headers |= {f["header"] - for f in features_json if f["kind"] == "ENUM"} - quoted_include = ['#include "%s"' % h for h in sorted(qouted_headers)] - - # using-decl for ENUM features. - using_decls = "\n".join("using %s_type = %s;" % ( - feature['name'], feature['type']) - for feature in features_json - if feature["kind"] == "ENUM") - nl = "\n" - return """%s - -%s - -#define BIT(X) (1 << X) - -%s - -%s - -uint32_t %s::OrderEncode(float F) { - static_assert(std::numeric_limits<float>::is_iec559, ""); - constexpr uint32_t TopBit = ~(~uint32_t{0} >> 1); - - // Get the bits of the float. Endianness is the same as for integers. - uint32_t U = llvm::bit_cast<uint32_t>(F); - std::memcpy(&U, &F, sizeof(U)); - // IEEE 754 floats compare like sign-magnitude integers. - if (U & TopBit) // Negative float. - return 0 - U; // Map onto the low half of integers, order reversed. - return U + TopBit; // Positive floats map onto the high half of integers. -} - -%s -%s -""" % (nl.join(angled_include), nl.join(quoted_include), cpp_class.ns_begin(), - using_decls, cpp_class.name, evaluate_func(forest_json, cpp_class), - cpp_class.ns_end()) - - -def main(): - parser = argparse.ArgumentParser('DecisionForestCodegen') - parser.add_argument('--filename', help='output file name.') - parser.add_argument('--output_dir', help='output directory.') - parser.add_argument('--model', help='path to model directory.') - parser.add_argument( - '--cpp_class', - help='The name of the class (which may be a namespace-qualified) created in generated header.' - ) - ns = parser.parse_args() - - output_dir = ns.output_dir - filename = ns.filename - header_file = "%s/%s.h" % (output_dir, filename) - cpp_file = "%s/%s.cpp" % (output_dir, filename) - cpp_class = CppClass(cpp_class=ns.cpp_class) - - model_file = "%s/forest.json" % ns.model - features_file = "%s/features.json" % ns.model - - with open(features_file) as f: - features_json = json.load(f) - - with open(model_file) as m: - forest_json = json.load(m) - - with open(cpp_file, 'w+t') as output_cc: - output_cc.write( - gen_cpp_code(forest_json=forest_json, - features_json=features_json, - filename=filename, - cpp_class=cpp_class)) - - with open(header_file, 'w+t') as output_h: - output_h.write(gen_header_code( - features_json=features_json, cpp_class=cpp_class, filename=filename)) - - -if __name__ == '__main__': - main() diff --git a/clang-tools-extra/clangd/quality/README.md b/clang-tools-extra/clangd/quality/README.md deleted file mode 100644 index 36fa37320e54..000000000000 --- a/clang-tools-extra/clangd/quality/README.md +++ /dev/null @@ -1,220 +0,0 @@ -# Decision Forest Code Completion Model - -## Decision Forest -A **decision forest** is a collection of many decision trees. A **decision tree** is a full binary tree that provides a quality prediction for an input (code completion item). Internal nodes represent a **binary decision** based on the input data, and leaf nodes represent a prediction. - -In order to predict the relevance of a code completion item, we traverse each of the decision trees beginning with their roots until we reach a leaf. - -An input (code completion candidate) is characterized as a set of **features**, such as the *type of symbol* or the *number of existing references*. - -At every non-leaf node, we evaluate the condition to decide whether to go left or right. The condition compares one *feature** of the input against a constant. The condition can be of two types: -- **if_greater**: Checks whether a numerical feature is **>=** a **threshold**. -- **if_member**: Check whether the **enum** feature is contained in the **set** defined in the node. - -A leaf node contains the value **score**. -To compute an overall **quality** score, we traverse each tree in this way and add up the scores. - -## Model Input Format -The input model is represented in json format. - -### Features -The file **features.json** defines the features available to the model. -It is a json list of features. The features can be of following two kinds. - -#### Number -``` -{ - "name": "a_numerical_feature", - "kind": "NUMBER" -} -``` -#### Enum -``` -{ - "name": "an_enum_feature", - "kind": "ENUM", - "enum": "fully::qualified::enum", - "header": "path/to/HeaderDeclaringEnum.h" -} -``` -The field `enum` specifies the fully qualified name of the enum. -The maximum cardinality of the enum can be **32**. - -The field `header` specifies the header containing the declaration of the enum. -This header is included by the inference runtime. - - -### Decision Forest -The file `forest.json` defines the decision forest. It is a json list of **DecisionTree**. - -**DecisionTree** is one of **IfGreaterNode**, **IfMemberNode**, **LeafNode**. -#### IfGreaterNode -``` -{ - "operation": "if_greater", - "feature": "a_numerical_feature", - "threshold": A real number, - "then": {A DecisionTree}, - "else": {A DecisionTree} -} -``` -#### IfMemberNode -``` -{ - "operation": "if_member", - "feature": "an_enum_feature", - "set": ["enum_value1", "enum_value2", ...], - "then": {A DecisionTree}, - "else": {A DecisionTree} -} -``` -#### LeafNode -``` -{ - "operation": "boost", - "score": A real number -} -``` - -## Code Generator for Inference -The implementation of inference runtime is split across: - -### Code generator -The code generator `CompletionModelCodegen.py` takes input the `${model}` dir and generates the inference library: -- `${output_dir}/{filename}.h` -- `${output_dir}/{filename}.cpp` - -Invocation -``` -python3 CompletionModelCodegen.py \ - --model path/to/model/dir \ - --output_dir path/to/output/dir \ - --filename OutputFileName \ - --cpp_class clang::clangd::YourExampleClass -``` -### Build System -`CompletionModel.cmake` provides `gen_decision_forest` method . -Client intending to use the CompletionModel for inference can use this to trigger the code generator and generate the inference library. -It can then use the generated API by including and depending on this library. - -### Generated API for inference -The code generator defines the Example `class` inside relevant namespaces as specified in option `${cpp_class}`. - -Members of this generated class comprises of all the features mentioned in `features.json`. -Thus this class can represent a code completion candidate that needs to be scored. - -The API also provides `float Evaluate(const MyClass&)` which can be used to score the completion candidate. - - -## Example -### model/features.json -``` -[ - { - "name": "ANumber", - "type": "NUMBER" - }, - { - "name": "AFloat", - "type": "NUMBER" - }, - { - "name": "ACategorical", - "type": "ENUM", - "enum": "ns1::ns2::TestEnum", - "header": "model/CategoricalFeature.h" - } -] -``` -### model/forest.json -``` -[ - { - "operation": "if_greater", - "feature": "ANumber", - "threshold": 200.0, - "then": { - "operation": "if_greater", - "feature": "AFloat", - "threshold": -1, - "then": { - "operation": "boost", - "score": 10.0 - }, - "else": { - "operation": "boost", - "score": -20.0 - } - }, - "else": { - "operation": "if_member", - "feature": "ACategorical", - "set": [ - "A", - "C" - ], - "then": { - "operation": "boost", - "score": 3.0 - }, - "else": { - "operation": "boost", - "score": -4.0 - } - } - }, - { - "operation": "if_member", - "feature": "ACategorical", - "set": [ - "A", - "B" - ], - "then": { - "operation": "boost", - "score": 5.0 - }, - "else": { - "operation": "boost", - "score": -6.0 - } - } -] -``` -### DecisionForestRuntime.h -``` -... -namespace ns1 { -namespace ns2 { -namespace test { -class Example { -public: - void setANumber(float V) { ... } - void setAFloat(float V) { ... } - void setACategorical(unsigned V) { ... } - -private: - ... -}; - -float Evaluate(const Example&); -} // namespace test -} // namespace ns2 -} // namespace ns1 -``` - -### CMake Invocation -Inorder to use the inference runtime, one can use `gen_decision_forest` function -described in `CompletionModel.cmake` which invokes `CodeCompletionCodegen.py` with the appropriate arguments. - -For example, the following invocation reads the model present in `path/to/model` and creates -`${CMAKE_CURRENT_BINARY_DIR}/myfilename.h` and `${CMAKE_CURRENT_BINARY_DIR}/myfilename.cpp` -describing a `class` named `MyClass` in namespace `fully::qualified`. - - - -``` -gen_decision_forest(path/to/model - myfilename - ::fully::qualifed::MyClass) -``` \ No newline at end of file diff --git a/clang-tools-extra/clangd/quality/model/features.json b/clang-tools-extra/clangd/quality/model/features.json deleted file mode 100644 index e91eccd1ce20..000000000000 --- a/clang-tools-extra/clangd/quality/model/features.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - { - "name": "ContextKind", - "kind": "ENUM", - "type": "clang::CodeCompletionContext::Kind", - "header": "clang/Sema/CodeCompleteConsumer.h" - } -] \ No newline at end of file diff --git a/clang-tools-extra/clangd/quality/model/forest.json b/clang-tools-extra/clangd/quality/model/forest.json deleted file mode 100644 index 78a1524e2d81..000000000000 --- a/clang-tools-extra/clangd/quality/model/forest.json +++ /dev/null @@ -1,18 +0,0 @@ -[ - { - "operation": "if_member", - "feature": "ContextKind", - "set": [ - "CCC_DotMemberAccess", - "CCC_ArrowMemberAccess" - ], - "then": { - "operation": "boost", - "score": 3.0 - }, - "else": { - "operation": "boost", - "score": 1.0 - } - } -] \ No newline at end of file diff --git a/clang-tools-extra/clangd/unittests/CMakeLists.txt b/clang-tools-extra/clangd/unittests/CMakeLists.txt index a84fd0b71ca5..2167b5e210e2 100644 --- a/clang-tools-extra/clangd/unittests/CMakeLists.txt +++ b/clang-tools-extra/clangd/unittests/CMakeLists.txt @@ -28,9 +28,6 @@ if (CLANGD_ENABLE_REMOTE) set(REMOTE_TEST_SOURCES remote/MarshallingTests.cpp) endif() -include(${CMAKE_CURRENT_SOURCE_DIR}/../quality/CompletionModel.cmake) -gen_decision_forest(${CMAKE_CURRENT_SOURCE_DIR}/decision_forest_model DecisionForestRuntimeTest ::ns1::ns2::test::Example) - add_custom_target(ClangdUnitTests) add_unittest(ClangdUnitTests ClangdTests Annotations.cpp @@ -47,7 +44,6 @@ add_unittest(ClangdUnitTests ClangdTests ConfigCompileTests.cpp ConfigProviderTests.cpp ConfigYAMLTests.cpp - DecisionForestTests.cpp DexTests.cpp DiagnosticsTests.cpp DraftStoreTests.cpp @@ -93,7 +89,6 @@ add_unittest(ClangdUnitTests ClangdTests TweakTesting.cpp URITests.cpp XRefsTests.cpp - ${CMAKE_CURRENT_BINARY_DIR}/DecisionForestRuntimeTest.cpp support/CancellationTests.cpp support/ContextTests.cpp @@ -108,11 +103,6 @@ add_unittest(ClangdUnitTests ClangdTests $<TARGET_OBJECTS:obj.clangDaemonTweaks> ) -# Include generated ComletionModel headers. -target_include_directories(ClangdTests PUBLIC - $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}> -) - clang_target_link_libraries(ClangdTests PRIVATE clangAST diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp index 460976d64f9f..635e036039a0 100644 --- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp +++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp @@ -10,7 +10,6 @@ #include "ClangdServer.h" #include "CodeComplete.h" #include "Compiler.h" -#include "CompletionModel.h" #include "Matchers.h" #include "Protocol.h" #include "Quality.h" @@ -48,7 +47,6 @@ using ::testing::HasSubstr; using ::testing::IsEmpty; using ::testing::Not; using ::testing::UnorderedElementsAre; -using ContextKind = CodeCompletionContext::Kind; // GMock helpers for matching completion items. MATCHER_P(Named, Name, "") { return arg.Name == Name; } @@ -163,16 +161,6 @@ Symbol withReferences(int N, Symbol S) { return S; } -TEST(DecisionForestRuntime, SanityTest) { - using Example = clangd::Example; - using clangd::Evaluate; - Example E1; - E1.setContextKind(ContextKind::CCC_ArrowMemberAccess); - Example E2; - E2.setContextKind(ContextKind::CCC_SymbolOrNewName); - EXPECT_GT(Evaluate(E1), Evaluate(E2)); -} - TEST(CompletionTest, Limit) { clangd::CodeCompleteOptions Opts; Opts.Limit = 2; diff --git a/clang-tools-extra/clangd/unittests/DecisionForestTests.cpp b/clang-tools-extra/clangd/unittests/DecisionForestTests.cpp deleted file mode 100644 index d29c8a4a0358..000000000000 --- a/clang-tools-extra/clangd/unittests/DecisionForestTests.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "DecisionForestRuntimeTest.h" -#include "decision_forest_model/CategoricalFeature.h" -#include "gtest/gtest.h" - -namespace clang { -namespace clangd { - -TEST(DecisionForestRuntime, Evaluate) { - using Example = ::ns1::ns2::test::Example; - using Cat = ::ns1::ns2::TestEnum; - using ::ns1::ns2::test::Evaluate; - - Example E; - E.setANumber(200); // True - E.setAFloat(0); // True: +10.0 - E.setACategorical(Cat::A); // True: +5.0 - EXPECT_EQ(Evaluate(E), 15.0); - - E.setANumber(200); // True - E.setAFloat(-2.5); // False: -20.0 - E.setACategorical(Cat::B); // True: +5.0 - EXPECT_EQ(Evaluate(E), -15.0); - - E.setANumber(100); // False - E.setACategorical(Cat::C); // True: +3.0, False: -6.0 - EXPECT_EQ(Evaluate(E), -3.0); -} -} // namespace clangd -} // namespace clang diff --git a/clang-tools-extra/clangd/unittests/decision_forest_model/CategoricalFeature.h b/clang-tools-extra/clangd/unittests/decision_forest_model/CategoricalFeature.h deleted file mode 100644 index dfb6ab3b199d..000000000000 --- a/clang-tools-extra/clangd/unittests/decision_forest_model/CategoricalFeature.h +++ /dev/null @@ -1,5 +0,0 @@ -namespace ns1 { -namespace ns2 { -enum TestEnum { A, B, C, D }; -} // namespace ns2 -} // namespace ns1 diff --git a/clang-tools-extra/clangd/unittests/decision_forest_model/features.json b/clang-tools-extra/clangd/unittests/decision_forest_model/features.json deleted file mode 100644 index 7f159f192e19..000000000000 --- a/clang-tools-extra/clangd/unittests/decision_forest_model/features.json +++ /dev/null @@ -1,16 +0,0 @@ -[ - { - "name": "ANumber", - "kind": "NUMBER" - }, - { - "name": "AFloat", - "kind": "NUMBER" - }, - { - "name": "ACategorical", - "kind": "ENUM", - "type": "ns1::ns2::TestEnum", - "header": "decision_forest_model/CategoricalFeature.h" - } -] \ No newline at end of file diff --git a/clang-tools-extra/clangd/unittests/decision_forest_model/forest.json b/clang-tools-extra/clangd/unittests/decision_forest_model/forest.json deleted file mode 100644 index 26f071da485d..000000000000 --- a/clang-tools-extra/clangd/unittests/decision_forest_model/forest.json +++ /dev/null @@ -1,52 +0,0 @@ -[ - { - "operation": "if_greater", - "feature": "ANumber", - "threshold": 200.0, - "then": { - "operation": "if_greater", - "feature": "AFloat", - "threshold": -1, - "then": { - "operation": "boost", - "score": 10.0 - }, - "else": { - "operation": "boost", - "score": -20.0 - } - }, - "else": { - "operation": "if_member", - "feature": "ACategorical", - "set": [ - "A", - "C" - ], - "then": { - "operation": "boost", - "score": 3.0 - }, - "else": { - "operation": "boost", - "score": -4.0 - } - } - }, - { - "operation": "if_member", - "feature": "ACategorical", - "set": [ - "A", - "B" - ], - "then": { - "operation": "boost", - "score": 5.0 - }, - "else": { - "operation": "boost", - "score": -6.0 - } - } -] \ No newline at end of file _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits