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

shape.paramconv.ParamConvTupled.scala Maven / Gradle / Ivy

The newest version!
package kuzminki.shape

import kuzminki.conv.ValConv


class ParamConv2[P1, P2](
    shape: Tuple2[ValConv[P1], ValConv[P2]]
  ) extends ParamConv[Tuple2[P1, P2]] {

  val (conv1, conv2) = shape

  def fromShape(params: Tuple2[P1, P2]) = params match {
    case (par1, par2) =>
      Vector(conv1.put(par1), conv2.put(par2))
  }
}

class ParamConv3[P1, P2, P3](
    shape: Tuple3[ValConv[P1], ValConv[P2], ValConv[P3]]
  ) extends ParamConv[Tuple3[P1, P2, P3]] {

  val (conv1, conv2, conv3) = shape

  def fromShape(params: Tuple3[P1, P2, P3]) = params match {
    case (par1, par2, par3) =>
      Vector(conv1.put(par1), conv2.put(par2), conv3.put(par3))
  }
}

class ParamConv4[P1, P2, P3, P4](
    shape: Tuple4[ValConv[P1], ValConv[P2], ValConv[P3], ValConv[P4]]
  ) extends ParamConv[Tuple4[P1, P2, P3, P4]] {

  val (conv1, conv2, conv3, conv4) = shape

  def fromShape(params: Tuple4[P1, P2, P3, P4]) = params match {
    case (par1, par2, par3, par4) =>
      Vector(conv1.put(par1), conv2.put(par2), conv3.put(par3), conv4.put(par4))
  }
}

class ParamConv5[P1, P2, P3, P4, P5](
    shape: Tuple5[ValConv[P1], ValConv[P2], ValConv[P3], ValConv[P4], ValConv[P5]]
  ) extends ParamConv[Tuple5[P1, P2, P3, P4, P5]] {

  val (conv1, conv2, conv3, conv4, conv5) = shape

  def fromShape(params: Tuple5[P1, P2, P3, P4, P5]) = params match {
    case (par1, par2, par3, par4, par5) =>
      Vector(conv1.put(par1), conv2.put(par2), conv3.put(par3), conv4.put(par4), conv5.put(par5))
  }
}

class ParamConv6[P1, P2, P3, P4, P5, P6](
    shape: Tuple6[ValConv[P1], ValConv[P2], ValConv[P3], ValConv[P4], ValConv[P5], ValConv[P6]]
  ) extends ParamConv[Tuple6[P1, P2, P3, P4, P5, P6]] {

  val (conv1, conv2, conv3, conv4, conv5, conv6) = shape

  def fromShape(params: Tuple6[P1, P2, P3, P4, P5, P6]) = params match {
    case (par1, par2, par3, par4, par5, par6) =>
      Vector(conv1.put(par1), conv2.put(par2), conv3.put(par3), conv4.put(par4), conv5.put(par5), conv6.put(par6))
  }
}

class ParamConv7[P1, P2, P3, P4, P5, P6, P7](
    shape: Tuple7[ValConv[P1], ValConv[P2], ValConv[P3], ValConv[P4], ValConv[P5], ValConv[P6], ValConv[P7]]
  ) extends ParamConv[Tuple7[P1, P2, P3, P4, P5, P6, P7]] {

  val (conv1, conv2, conv3, conv4, conv5, conv6, conv7) = shape

  def fromShape(params: Tuple7[P1, P2, P3, P4, P5, P6, P7]) = params match {
    case (par1, par2, par3, par4, par5, par6, par7) =>
      Vector(conv1.put(par1), conv2.put(par2), conv3.put(par3), conv4.put(par4), conv5.put(par5), conv6.put(par6), conv7.put(par7))
  }
}

class ParamConv8[P1, P2, P3, P4, P5, P6, P7, P8](
    shape: Tuple8[ValConv[P1], ValConv[P2], ValConv[P3], ValConv[P4], ValConv[P5], ValConv[P6], ValConv[P7], ValConv[P8]]
  ) extends ParamConv[Tuple8[P1, P2, P3, P4, P5, P6, P7, P8]] {

  val (conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8) = shape

  def fromShape(params: Tuple8[P1, P2, P3, P4, P5, P6, P7, P8]) = params match {
    case (par1, par2, par3, par4, par5, par6, par7, par8) =>
      Vector(conv1.put(par1), conv2.put(par2), conv3.put(par3), conv4.put(par4), conv5.put(par5), conv6.put(par6), conv7.put(par7), conv8.put(par8))
  }
}

class ParamConv9[P1, P2, P3, P4, P5, P6, P7, P8, P9](
    shape: Tuple9[ValConv[P1], ValConv[P2], ValConv[P3], ValConv[P4], ValConv[P5], ValConv[P6], ValConv[P7], ValConv[P8], ValConv[P9]]
  ) extends ParamConv[Tuple9[P1, P2, P3, P4, P5, P6, P7, P8, P9]] {

  val (conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8, conv9) = shape

  def fromShape(params: Tuple9[P1, P2, P3, P4, P5, P6, P7, P8, P9]) = params match {
    case (par1, par2, par3, par4, par5, par6, par7, par8, par9) =>
      Vector(conv1.put(par1), conv2.put(par2), conv3.put(par3), conv4.put(par4), conv5.put(par5), conv6.put(par6), conv7.put(par7), conv8.put(par8), conv9.put(par9))
  }
}

class ParamConv10[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10](
    shape: Tuple10[ValConv[P1], ValConv[P2], ValConv[P3], ValConv[P4], ValConv[P5], ValConv[P6], ValConv[P7], ValConv[P8], ValConv[P9], ValConv[P10]]
  ) extends ParamConv[Tuple10[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10]] {

  val (conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8, conv9, conv10) = shape

  def fromShape(params: Tuple10[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10]) = params match {
    case (par1, par2, par3, par4, par5, par6, par7, par8, par9, par10) =>
      Vector(conv1.put(par1), conv2.put(par2), conv3.put(par3), conv4.put(par4), conv5.put(par5), conv6.put(par6), conv7.put(par7), conv8.put(par8), conv9.put(par9), conv10.put(par10))
  }
}

class ParamConv11[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11](
    shape: Tuple11[ValConv[P1], ValConv[P2], ValConv[P3], ValConv[P4], ValConv[P5], ValConv[P6], ValConv[P7], ValConv[P8], ValConv[P9], ValConv[P10], ValConv[P11]]
  ) extends ParamConv[Tuple11[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11]] {

  val (conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8, conv9, conv10, conv11) = shape

  def fromShape(params: Tuple11[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11]) = params match {
    case (par1, par2, par3, par4, par5, par6, par7, par8, par9, par10, par11) =>
      Vector(conv1.put(par1), conv2.put(par2), conv3.put(par3), conv4.put(par4), conv5.put(par5), conv6.put(par6), conv7.put(par7), conv8.put(par8), conv9.put(par9), conv10.put(par10), conv11.put(par11))
  }
}

class ParamConv12[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12](
    shape: Tuple12[ValConv[P1], ValConv[P2], ValConv[P3], ValConv[P4], ValConv[P5], ValConv[P6], ValConv[P7], ValConv[P8], ValConv[P9], ValConv[P10], ValConv[P11], ValConv[P12]]
  ) extends ParamConv[Tuple12[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12]] {

  val (conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8, conv9, conv10, conv11, conv12) = shape

  def fromShape(params: Tuple12[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12]) = params match {
    case (par1, par2, par3, par4, par5, par6, par7, par8, par9, par10, par11, par12) =>
      Vector(conv1.put(par1), conv2.put(par2), conv3.put(par3), conv4.put(par4), conv5.put(par5), conv6.put(par6), conv7.put(par7), conv8.put(par8), conv9.put(par9), conv10.put(par10), conv11.put(par11), conv12.put(par12))
  }
}

class ParamConv13[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13](
    shape: Tuple13[ValConv[P1], ValConv[P2], ValConv[P3], ValConv[P4], ValConv[P5], ValConv[P6], ValConv[P7], ValConv[P8], ValConv[P9], ValConv[P10], ValConv[P11], ValConv[P12], ValConv[P13]]
  ) extends ParamConv[Tuple13[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13]] {

  val (conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8, conv9, conv10, conv11, conv12, conv13) = shape

  def fromShape(params: Tuple13[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13]) = params match {
    case (par1, par2, par3, par4, par5, par6, par7, par8, par9, par10, par11, par12, par13) =>
      Vector(conv1.put(par1), conv2.put(par2), conv3.put(par3), conv4.put(par4), conv5.put(par5), conv6.put(par6), conv7.put(par7), conv8.put(par8), conv9.put(par9), conv10.put(par10), conv11.put(par11), conv12.put(par12), conv13.put(par13))
  }
}

class ParamConv14[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14](
    shape: Tuple14[ValConv[P1], ValConv[P2], ValConv[P3], ValConv[P4], ValConv[P5], ValConv[P6], ValConv[P7], ValConv[P8], ValConv[P9], ValConv[P10], ValConv[P11], ValConv[P12], ValConv[P13], ValConv[P14]]
  ) extends ParamConv[Tuple14[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14]] {

  val (conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8, conv9, conv10, conv11, conv12, conv13, conv14) = shape

  def fromShape(params: Tuple14[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14]) = params match {
    case (par1, par2, par3, par4, par5, par6, par7, par8, par9, par10, par11, par12, par13, par14) =>
      Vector(conv1.put(par1), conv2.put(par2), conv3.put(par3), conv4.put(par4), conv5.put(par5), conv6.put(par6), conv7.put(par7), conv8.put(par8), conv9.put(par9), conv10.put(par10), conv11.put(par11), conv12.put(par12), conv13.put(par13), conv14.put(par14))
  }
}

class ParamConv15[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15](
    shape: Tuple15[ValConv[P1], ValConv[P2], ValConv[P3], ValConv[P4], ValConv[P5], ValConv[P6], ValConv[P7], ValConv[P8], ValConv[P9], ValConv[P10], ValConv[P11], ValConv[P12], ValConv[P13], ValConv[P14], ValConv[P15]]
  ) extends ParamConv[Tuple15[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15]] {

  val (conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8, conv9, conv10, conv11, conv12, conv13, conv14, conv15) = shape

  def fromShape(params: Tuple15[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15]) = params match {
    case (par1, par2, par3, par4, par5, par6, par7, par8, par9, par10, par11, par12, par13, par14, par15) =>
      Vector(conv1.put(par1), conv2.put(par2), conv3.put(par3), conv4.put(par4), conv5.put(par5), conv6.put(par6), conv7.put(par7), conv8.put(par8), conv9.put(par9), conv10.put(par10), conv11.put(par11), conv12.put(par12), conv13.put(par13), conv14.put(par14), conv15.put(par15))
  }
}

class ParamConv16[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16](
    shape: Tuple16[ValConv[P1], ValConv[P2], ValConv[P3], ValConv[P4], ValConv[P5], ValConv[P6], ValConv[P7], ValConv[P8], ValConv[P9], ValConv[P10], ValConv[P11], ValConv[P12], ValConv[P13], ValConv[P14], ValConv[P15], ValConv[P16]]
  ) extends ParamConv[Tuple16[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16]] {

  val (conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8, conv9, conv10, conv11, conv12, conv13, conv14, conv15, conv16) = shape

  def fromShape(params: Tuple16[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16]) = params match {
    case (par1, par2, par3, par4, par5, par6, par7, par8, par9, par10, par11, par12, par13, par14, par15, par16) =>
      Vector(conv1.put(par1), conv2.put(par2), conv3.put(par3), conv4.put(par4), conv5.put(par5), conv6.put(par6), conv7.put(par7), conv8.put(par8), conv9.put(par9), conv10.put(par10), conv11.put(par11), conv12.put(par12), conv13.put(par13), conv14.put(par14), conv15.put(par15), conv16.put(par16))
  }
}

class ParamConv17[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17](
    shape: Tuple17[ValConv[P1], ValConv[P2], ValConv[P3], ValConv[P4], ValConv[P5], ValConv[P6], ValConv[P7], ValConv[P8], ValConv[P9], ValConv[P10], ValConv[P11], ValConv[P12], ValConv[P13], ValConv[P14], ValConv[P15], ValConv[P16], ValConv[P17]]
  ) extends ParamConv[Tuple17[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17]] {

  val (conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8, conv9, conv10, conv11, conv12, conv13, conv14, conv15, conv16, conv17) = shape

  def fromShape(params: Tuple17[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17]) = params match {
    case (par1, par2, par3, par4, par5, par6, par7, par8, par9, par10, par11, par12, par13, par14, par15, par16, par17) =>
      Vector(conv1.put(par1), conv2.put(par2), conv3.put(par3), conv4.put(par4), conv5.put(par5), conv6.put(par6), conv7.put(par7), conv8.put(par8), conv9.put(par9), conv10.put(par10), conv11.put(par11), conv12.put(par12), conv13.put(par13), conv14.put(par14), conv15.put(par15), conv16.put(par16), conv17.put(par17))
  }
}

class ParamConv18[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18](
    shape: Tuple18[ValConv[P1], ValConv[P2], ValConv[P3], ValConv[P4], ValConv[P5], ValConv[P6], ValConv[P7], ValConv[P8], ValConv[P9], ValConv[P10], ValConv[P11], ValConv[P12], ValConv[P13], ValConv[P14], ValConv[P15], ValConv[P16], ValConv[P17], ValConv[P18]]
  ) extends ParamConv[Tuple18[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18]] {

  val (conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8, conv9, conv10, conv11, conv12, conv13, conv14, conv15, conv16, conv17, conv18) = shape

  def fromShape(params: Tuple18[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18]) = params match {
    case (par1, par2, par3, par4, par5, par6, par7, par8, par9, par10, par11, par12, par13, par14, par15, par16, par17, par18) =>
      Vector(conv1.put(par1), conv2.put(par2), conv3.put(par3), conv4.put(par4), conv5.put(par5), conv6.put(par6), conv7.put(par7), conv8.put(par8), conv9.put(par9), conv10.put(par10), conv11.put(par11), conv12.put(par12), conv13.put(par13), conv14.put(par14), conv15.put(par15), conv16.put(par16), conv17.put(par17), conv18.put(par18))
  }
}

class ParamConv19[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19](
    shape: Tuple19[ValConv[P1], ValConv[P2], ValConv[P3], ValConv[P4], ValConv[P5], ValConv[P6], ValConv[P7], ValConv[P8], ValConv[P9], ValConv[P10], ValConv[P11], ValConv[P12], ValConv[P13], ValConv[P14], ValConv[P15], ValConv[P16], ValConv[P17], ValConv[P18], ValConv[P19]]
  ) extends ParamConv[Tuple19[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19]] {

  val (conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8, conv9, conv10, conv11, conv12, conv13, conv14, conv15, conv16, conv17, conv18, conv19) = shape

  def fromShape(params: Tuple19[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19]) = params match {
    case (par1, par2, par3, par4, par5, par6, par7, par8, par9, par10, par11, par12, par13, par14, par15, par16, par17, par18, par19) =>
      Vector(conv1.put(par1), conv2.put(par2), conv3.put(par3), conv4.put(par4), conv5.put(par5), conv6.put(par6), conv7.put(par7), conv8.put(par8), conv9.put(par9), conv10.put(par10), conv11.put(par11), conv12.put(par12), conv13.put(par13), conv14.put(par14), conv15.put(par15), conv16.put(par16), conv17.put(par17), conv18.put(par18), conv19.put(par19))
  }
}

class ParamConv20[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19, P20](
    shape: Tuple20[ValConv[P1], ValConv[P2], ValConv[P3], ValConv[P4], ValConv[P5], ValConv[P6], ValConv[P7], ValConv[P8], ValConv[P9], ValConv[P10], ValConv[P11], ValConv[P12], ValConv[P13], ValConv[P14], ValConv[P15], ValConv[P16], ValConv[P17], ValConv[P18], ValConv[P19], ValConv[P20]]
  ) extends ParamConv[Tuple20[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19, P20]] {

  val (conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8, conv9, conv10, conv11, conv12, conv13, conv14, conv15, conv16, conv17, conv18, conv19, conv20) = shape

  def fromShape(params: Tuple20[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19, P20]) = params match {
    case (par1, par2, par3, par4, par5, par6, par7, par8, par9, par10, par11, par12, par13, par14, par15, par16, par17, par18, par19, par20) =>
      Vector(conv1.put(par1), conv2.put(par2), conv3.put(par3), conv4.put(par4), conv5.put(par5), conv6.put(par6), conv7.put(par7), conv8.put(par8), conv9.put(par9), conv10.put(par10), conv11.put(par11), conv12.put(par12), conv13.put(par13), conv14.put(par14), conv15.put(par15), conv16.put(par16), conv17.put(par17), conv18.put(par18), conv19.put(par19), conv20.put(par20))
  }
}

class ParamConv21[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19, P20, P21](
    shape: Tuple21[ValConv[P1], ValConv[P2], ValConv[P3], ValConv[P4], ValConv[P5], ValConv[P6], ValConv[P7], ValConv[P8], ValConv[P9], ValConv[P10], ValConv[P11], ValConv[P12], ValConv[P13], ValConv[P14], ValConv[P15], ValConv[P16], ValConv[P17], ValConv[P18], ValConv[P19], ValConv[P20], ValConv[P21]]
  ) extends ParamConv[Tuple21[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19, P20, P21]] {

  val (conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8, conv9, conv10, conv11, conv12, conv13, conv14, conv15, conv16, conv17, conv18, conv19, conv20, conv21) = shape

  def fromShape(params: Tuple21[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19, P20, P21]) = params match {
    case (par1, par2, par3, par4, par5, par6, par7, par8, par9, par10, par11, par12, par13, par14, par15, par16, par17, par18, par19, par20, par21) =>
      Vector(conv1.put(par1), conv2.put(par2), conv3.put(par3), conv4.put(par4), conv5.put(par5), conv6.put(par6), conv7.put(par7), conv8.put(par8), conv9.put(par9), conv10.put(par10), conv11.put(par11), conv12.put(par12), conv13.put(par13), conv14.put(par14), conv15.put(par15), conv16.put(par16), conv17.put(par17), conv18.put(par18), conv19.put(par19), conv20.put(par20), conv21.put(par21))
  }
}

class ParamConv22[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19, P20, P21, P22](
    shape: Tuple22[ValConv[P1], ValConv[P2], ValConv[P3], ValConv[P4], ValConv[P5], ValConv[P6], ValConv[P7], ValConv[P8], ValConv[P9], ValConv[P10], ValConv[P11], ValConv[P12], ValConv[P13], ValConv[P14], ValConv[P15], ValConv[P16], ValConv[P17], ValConv[P18], ValConv[P19], ValConv[P20], ValConv[P21], ValConv[P22]]
  ) extends ParamConv[Tuple22[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19, P20, P21, P22]] {

  val (conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8, conv9, conv10, conv11, conv12, conv13, conv14, conv15, conv16, conv17, conv18, conv19, conv20, conv21, conv22) = shape

  def fromShape(params: Tuple22[P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19, P20, P21, P22]) = params match {
    case (par1, par2, par3, par4, par5, par6, par7, par8, par9, par10, par11, par12, par13, par14, par15, par16, par17, par18, par19, par20, par21, par22) =>
      Vector(conv1.put(par1), conv2.put(par2), conv3.put(par3), conv4.put(par4), conv5.put(par5), conv6.put(par6), conv7.put(par7), conv8.put(par8), conv9.put(par9), conv10.put(par10), conv11.put(par11), conv12.put(par12), conv13.put(par13), conv14.put(par14), conv15.put(par15), conv16.put(par16), conv17.put(par17), conv18.put(par18), conv19.put(par19), conv20.put(par20), conv21.put(par21), conv22.put(par22))
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy