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

org.aiddl.common.scala.reasoning.constraint.ConvertTablesToBinary.scala Maven / Gradle / Ivy

Go to download

Provides common types and algorithm implementations for the fast prototyping integrative AI systems with the AIDDL framework.

The newest version!
package org.aiddl.common.scala.reasoning.constraint

import org.aiddl.common.scala.reasoning.constraint.ConstraintTerm.{Constraints, Domains, Variables}
import org.aiddl.common.scala.reasoning.constraint.{Constraint, ConstraintSatisfactionProblem, CspSolver}
import org.aiddl.core.scala.function.Function
import org.aiddl.core.scala.representation.{CollectionTerm, KeyVal, ListTerm, SetTerm, Substitution, Term, Tuple, Var}
import org.aiddl.core.scala.util.ComboIterator
import org.aiddl.core.scala.util.logger.Logger

import scala.collection.mutable

class ConvertTablesToBinary {

  def apply(csp: ConstraintSatisfactionProblem): ConstraintSatisfactionProblem = {
    val binaryCollection = new mutable.HashMap[Tuple, CollectionTerm]
      .withDefaultValue(SetTerm.empty)

    for ( c <- csp.constraints ) {
      for {
        i1 <- (0 until c.arity) if c.scope(i1).isInstanceOf[Var]
        i2 <- (0 until c.arity) if i1 != i2 && c.scope(i2).isInstanceOf[Var]
      } {
        val inverse = c.scope(i1).toString > c.scope(i2).toString
        val i = if inverse then i2 else i1
        val j = if inverse then i1 else i2

        val x1 = c.scope(i)
        val x2 = c.scope(j)
        val scope = Tuple(x1, x2)
        val relations =
          SetTerm(c.term(1).asCol.map(row => Tuple(row(i), row(j))).toSet)

        binaryCollection.put(scope, binaryCollection(scope).addAll(relations))
      }
    }

    val binaryConstraints =
      binaryCollection.map((scope, relations) => Constraint(Tuple(scope, relations))).toSet

    new ConstraintSatisfactionProblem(
      csp.variables,
      csp.domains,
      binaryConstraints
    )
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy