{"record":{"id":"c036840ae253c686","repo":"stanfordnlp/CoreNLP","slug":"flags-softmaxoutputlayer-true-but-neither-flag-c03684","errorCode":null,"errorMessage":"flags.softmaxOutputLayer == true, but neither flags.sparseOutputLayer or flags.tieOutputLayer is true","messagePattern":"flags\\.softmaxOutputLayer == true, but neither flags\\.sparseOutputLayer or flags\\.tieOutputLayer is true","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"src/edu/stanford/nlp/ie/crf/CRFNonLinearSecondOrderLogConditionalObjectiveFunction.java","lineNumber":121,"sourceCode":"    this.backgroundSymbol = flags.backgroundSymbol;\n    this.sigma = flags.sigma;\n    this.outputLayerSize = numClasses;\n    this.outputLayerSize4Edge = numClasses * numClasses;\n    this.numHiddenUnits = flags.numHiddenUnits;\n    this.inputLayerSize = numHiddenUnits * numClasses;\n    this.inputLayerSize4Edge = numHiddenUnits * numClasses * numClasses;\n    this.numNodeFeatures = numNodeFeatures;\n    this.numEdgeFeatures = numEdgeFeatures;\n    this.useOutputLayer = flags.useOutputLayer;\n    this.useHiddenLayer = flags.useHiddenLayer;\n    this.useSigmoid = flags.useSigmoid;\n    this.docWindowLabels = new int[data.length][];\n    if (!useOutputLayer) {\n      log.info(\"Output layer not activated, inputLayerSize must be equal to numClasses, setting it to \" + numClasses);\n      this.inputLayerSize = numClasses;\n      this.inputLayerSize4Edge = numClasses * numClasses;\n    } else if (flags.softmaxOutputLayer && !(flags.sparseOutputLayer || flags.tieOutputLayer)) {\n      throw new RuntimeException(\"flags.softmaxOutputLayer == true, but neither flags.sparseOutputLayer or flags.tieOutputLayer is true\");\n    }\n    // empiricalCounts();\n  }\n\n  @Override\n  public int domainDimension() {\n    if (domainDimension < 0) {\n      originalFeatureCount = 0;\n      for (int aMap : map) {\n        int s = labelIndices.get(aMap).size();\n        originalFeatureCount += s;\n      }\n      domainDimension = 0;\n      domainDimension += inputLayerSize4Edge * numEdgeFeatures;\n      domainDimension += inputLayerSize * numNodeFeatures;\n      beforeOutputWeights = domainDimension;\n      if (useOutputLayer) {\n        if (flags.sparseOutputLayer) {","sourceCodeStart":103,"sourceCodeEnd":139,"githubUrl":"https://github.com/stanfordnlp/CoreNLP/blob/1b7edd19c4d0d7b1f13a2591425b9b60a0b1af7a/src/edu/stanford/nlp/ie/crf/CRFNonLinearSecondOrderLogConditionalObjectiveFunction.java#L103-L139","documentation":"CRFNonLinearSecondOrderLogConditionalObjectiveFunction's constructor requires that a softmax output layer be used together with either a sparse output layer or tied output layer. When flags.softmaxOutputLayer is true but both sparseOutputLayer and tieOutputLayer are false, the required layout is undefined, so construction fails fast with a RuntimeException.","triggerScenarios":"Building the objective function with SeqClassifierFlags where softmaxOutputLayer=true, sparseOutputLayer=false, tieOutputLayer=false -- i.e. useOutputLayer is active (non-linear CRF training) but the softmax flag's structural prerequisite is missing.","commonSituations":"Enabling softmaxOutputLayer in training properties while forgetting to also set sparseOutputLayer or tieOutputLayer; copying flag sets from examples that used the linear CRF instead of the non-linear one.","solutions":["Set flags.sparseOutputLayer = true alongside softmaxOutputLayer.","Alternatively set flags.tieOutputLayer = true if parameter tying is the intended layout.","Or disable softmaxOutputLayer if the plain output layer is sufficient.","Review the SeqClassifierFlags combinations documented for useNonLinearCRF training."],"exampleFix":"// before\nflags.useNonLinearCRF = true;\nflags.softmaxOutputLayer = true;\n// after\nflags.useNonLinearCRF = true;\nflags.softmaxOutputLayer = true;\nflags.sparseOutputLayer = true; // or flags.tieOutputLayer = true;","handlingStrategy":"validation","validationCode":"// validate flag combinations before training\nif (props.getProperty(\"softmaxOutputLayer\", \"false\").equals(\"true\") &&\n    !props.getProperty(\"sparseOutputLayer\", \"false\").equals(\"true\") &&\n    !props.getProperty(\"tieOutputLayer\", \"false\").equals(\"true\")) {\n  throw new IllegalArgumentException(\"softmaxOutputLayer requires sparseOutputLayer or tieOutputLayer\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  classifier.train(props);\n} catch (RuntimeException e) {\n  if (e.getMessage().contains(\"softmaxOutputLayer == true\")) {\n    props.setProperty(\"sparseOutputLayer\", \"true\");\n    classifier.train(props);\n  } else throw e;\n}","preventionTips":["Centralize flag validation in a config pre-check utility","Start from documented working flag sets for useNonLinearCRF","Smoke-test flag combinations on a small corpus before long runs"],"tags":["crf","flags","configuration","softmax"],"backgroundTag":"conflicting-config-options","analyzedSha":"1b7edd19c4d0d7b1f13a2591425b9b60a0b1af7a","analyzedAt":"2026-09-10T02:24:07.274Z","contentChangedAt":"2026-09-10T02:24:07.274Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}