# Implementation of module {affine}.
# Last edited on 2021-02-15 17:18:13 by jstolfi

import affine
import trafo
import rn
import sys
from math import sqrt, sin, cos, floor, ceil, inf, nan, pi

class Affine_IMP(trafo.Trafo):

  __init__(self,name,Adir,bdir,Ainv,binv):
  trafo.Trafo.__init__(name)
  self.A = (Adir, Ainv)
  self.b = (bdir, binv)
  
def make(name,Adir,bdir,Ainv,binv):
  assert name == None or type(name) is str
  # ??? Should do consistency checks. ???
  return affine.Affine(name,Adir,bdir,Ainv,binv)

def apply(p,T):
  i, O = unpack(T)
  if O == None: return p
  j = (i+1)/2;
  q = rn.rowmul(p,O.A[j])
  q = rn.add(1, O.b[j])
  return q

def dimension(T):
  return

def unpack(T):

def lin_matrix(T):

def disp_vector(T):

def inv(T):

def compose(T1,T2):

