All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.oliviercailloux.javagrade.utils.Owa Maven / Gradle / Ivy

The newest version!
package io.github.oliviercailloux.javagrade.utils;

import static com.google.common.base.Preconditions.checkArgument;

import com.google.common.base.VerifyException;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import com.google.common.collect.MoreCollectors;
import io.github.oliviercailloux.grade.Criterion;
import io.github.oliviercailloux.grade.GradeUtils;
import io.github.oliviercailloux.grade.IGrade;
import io.github.oliviercailloux.grade.IGrade.CriteriaPath;
import io.github.oliviercailloux.grade.format.json.JsonCriterion;
import io.github.oliviercailloux.grade.format.json.JsonGrade;
import io.github.oliviercailloux.javagrade.graders.WorkersGrader;
import io.github.oliviercailloux.json.JsonbUtils;
import java.lang.reflect.Type;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.stream.DoubleStream;
import java.util.stream.IntStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Owa {
  @SuppressWarnings("unused")
  private static final Logger LOGGER = LoggerFactory.getLogger(Owa.class);

  public static void main(String[] args) throws Exception {
    final String prefix = WorkersGrader.PREFIX;

    @SuppressWarnings("serial")
    final Type type = new LinkedHashMap() {}.getClass().getGenericSuperclass();

    final Map grades = JsonbUtils.fromJson(
        Files.readString(Path.of("grades " + prefix + ".json")), type, JsonGrade.instance());
    final ImmutableMap gradesOwa =
        Maps.toMap(grades.keySet(), s -> toOwa(grades.get(s)));

    Files.writeString(Path.of("grades " + prefix + " owa.json"), JsonbUtils
        .toJsonObject(gradesOwa, JsonCriterion.instance(), JsonGrade.instance()).toString());
  }

  private static IGrade toOwa(IGrade grade) {
    if (grade.getPoints() == 0d) {
      return grade;
    }

    final Criterion gradeCriterion = Criterion.given("grade");
    final Criterion mainCriterion = Criterion.given("main");
    final Criterion codeCriterion = Criterion.given("Code");

    final ArrayList paths = new ArrayList<>();
    if (!grade.getSubGrades().keySet().contains(gradeCriterion)
        && ImmutableSet.copyOf(grade.getWeights().values()).equals(ImmutableSet.of(0d, 1d))) {
      final Criterion right = grade.getWeights().keySet().stream()
          .filter(c -> grade.getWeights().get(c) == 1d).collect(MoreCollectors.onlyElement());
      checkArgument(right.getName().startsWith("Cap at "), right);
      paths.add(right);
    }

    if (grade.getGrade(CriteriaPath.from(paths))
        .orElseThrow(() -> new VerifyException(grade.toString())).getSubGrades().keySet()
        .contains(gradeCriterion)) {
      paths.add(gradeCriterion);
    }
    paths.add(mainCriterion);
    if (grade.getGrade(CriteriaPath.from(paths))
        .orElseThrow(() -> new VerifyException(grade.toString())).getSubGrades().keySet()
        .contains(codeCriterion)) {
      paths.add(codeCriterion);
    }

    final CriteriaPath codePath = CriteriaPath.from(paths);
    final IGrade code =
        grade.getGrade(codePath).orElseThrow(() -> new IllegalArgumentException(grade.toString()));

    final DoubleStream streamOfOnes = DoubleStream.generate(() -> 1d).limit(6);
    final DoubleStream streamIncr = IntStream.range(2, 9).asDoubleStream();
    final ImmutableList increasingWeights = DoubleStream.concat(streamOfOnes, streamIncr)
        .boxed().collect(ImmutableList.toImmutableList());

    final IGrade newCode = GradeUtils.toOwa(code, increasingWeights);
    return grade.withSubGrade(codePath, newCode);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy