<commit_before># -*- coding:utf-8 -*-
#
# This file is part of OpenFisca.
# OpenFisca is a socio-fiscal microsimulation software
# Copyright © 2011 <NAME>, <NAME>
# Licensed under the terms of the GPL (version 3 or later) license
# (see openfisca/__init__.py for details)


from __future__ import division
from src.countries.france.model.data import CAT
from numpy import maximum as max_, minimum as min_, logical_not as not_, zeros, ones
from src.lib.utils import  scaleBaremes, combineBaremes, BaremeDict


                
# TODO: CHECK la csg déductible en 2006 est case GH
# TODO:  la revenus soumis aux csg déductible et imposable sont en CG et BH en 2010 

#        # Heures supplémentaires exonérées
#        if not self.bareme.ir.autre.hsup_exo:
#            self.sal += self.hsup
#            self.hsup = 0*self.hsup
                        
# Exonération de CSG et de CRDS sur les revenus du chômage 
# et des préretraites si cela abaisse ces revenus sous le smic brut        
# TODO: mettre un trigger pour l'éxonération des revenus du chômage sous un smic

# TODO: RAFP assiette + prime
# TODO: pension assiette = salaire hors prime
# autres salaires + primes


# TODO: contribution patronale de prévoyance complémentaire
# Formation professionnelle (entreprise de 10 à moins de 20 salariés) salaire total 1,05%
# Formation professionnelle (entreprise de moins de 10 salariés)      salaire total 0,55%
# Taxe sur les salaries (pour ceux non-assujettis à la TVA)           salaire total 4,25% 
# TODO: accident du travail ?
    
#temp = 0
#if hasattr(P, "prelsoc"):
#    for val in P.prelsoc.__dict__.itervalues(): temp += val
#    P.prelsoc.total = temp         
#else : 
#    P.__dict__.update({"prelsoc": {"total": 0} })
#
#a = {'sal':sal, 'pat':pat, 'csg':csg, 'crds':crds, 'exo_fillon': P.cotsoc.exo_fillon, 'lps': P.lps, 'ir': P.ir, 'prelsoc': P.prelsoc}
#return Dicts2Object(**a)

def _mhsup(hsup):
    """
    Heures supplémentaires comptées négativement
    """
    return -hsup

############################################################################
## Revenus du capital
############################################################################

# revenus du capital soumis au barème
def _csg_cap_bar(rev_cap_bar, _P):
    '''
    Calcule la CSG sur les revenus du captial soumis au barème
    '''
    return - rev_cap_bar*_P.csg.capital.glob

def _crds_cap_bar(rev_cap_bar, _P):
    '''
    Calcule la CRDS sur les revenus du capital soumis au barème
    '''
    return - rev_cap_bar*_P.crds.capital

def _prelsoc_cap_bar(rev_cap_bar, _P):
    '''
    Calcule le prélèvement social sur les revenus du capital soumis au barème
    '''
    P = _P.prelsoc
    if _P.datesim.year < 2006:
        total = P.base 
    elif _P.datesim.year < 2009:    
        total = P.base + P.add
    else:    
        total = P.base + P.add + P.rsa
    return - rev_cap_bar*total

# revenus du capital soumis au prélèvement libératoire
def _csg_cap_lib(rev_cap_lib, _P):
    '''
    Calcule la CSG sur les revenus du capital soumis au prélèvement libératoire
    '''
    return - rev_cap_lib*_P.csg.capital.glob

def _crds_cap_lib(rev_cap_lib, _P):
    '''
    Calcule la CRDS sur les revenus du capital soumis au prélèvement libératoire
    '''
    return - rev_cap_lib*_P.crds.capital

def _prelsoc_cap_lib(rev_cap_lib, _P):
    '''
    Calcule le prélèvement social sur les revenus du capital soumis au prélèvement libératoire
    '''
    P = _P.prelsoc
    if _P.datesim.year < 2006:
        total = P.base 
    elif _P.datesim.year < 2009:    
        total = P.base + P.add
    else:    
        total = P.base + P.add + P.rsa
    return - rev_cap_lib*total


# TODO: non_imposabilité pour les revenus au barème
#        verse = (-csgcap_bar - crdscap_bar - prelsoccap_bar) > bareme.csg.capital.nonimp
##        verse=1
#        # CSG sur les revenus du patrimoine non imposés au barême (contributions sociales déjà prélevées)
#                
#        table.setIndiv('csgcap_bar', csgcap_bar*verse)
#        table.setIndiv('prelsoccap_bar', prelsoccap_bar*verse)
#        table.setIndiv('crdscap_bar', crdscap_bar*verse)


############################################################################
## Salaires
############################################################################

def _salbrut(sali, hsup, type_sal, _defaultP):
    '''
    Calcule le salaire brut à partir du salaire net
    '''
    plaf_ss = 12*_defaultP.cotsoc.gen.plaf_ss

    sal = scaleBaremes(BaremeDict('sal', _defaultP.cotsoc.sal), plaf_ss)
    csg = scaleBaremes(BaremeDict('csg', _defaultP.csg), plaf_ss)
    
    sal['noncadre'].update(sal['commun'])
    sal['cadre'].update(sal['commun'])


    noncadre = combineBaremes(sal['noncadre'])
    cadre    = combineBaremes(sal['cadre'])
    fonc     = combineBaremes(sal['fonc'])

    # On ajoute la CSG deductible
    noncadre.addBareme(csg['act']['deduc'])
    cadre.addBareme(csg['act']['deduc'])
    fonc.addBareme(csg['act']['deduc'])
    
    nca = noncadre.inverse()
    cad = cadre.inverse()
    fon = fonc.inverse()

    brut_nca = nca.calc(sali)
    brut_cad = cad.calc(sali)
    brut_fon = fon.calc(sali)

    salbrut = (brut_nca*(type_sal == CAT['noncadre']) + 
               brut_cad*(type_sal == CAT['cadre']) + 
               brut_fon*(type_sal == CAT['etat_t']) )
    
    return salbrut + hsup


def _type_sal(titc, statut, chpub, cadre, _P):
    '''
    Defines the type_sal of the individual
    0 noncadre
    1 cadre
    2 etat_t   : agent titualire de l'Etat
    3 colloc_t : agent titualire des collectivités locales
    4 contract : agent contractuel de l'Etat ou des collectivités locales
    
    '''
    
    cadre    = (statut ==8)*(chpub>3)*cadre 
    noncadre = (statut ==8)*(chpub>3)*not_(cadre)    

    
    etat_stag = (chpub==1)*(titc == 1)
    etat_tit  = (chpub==1)*(titc == 2)
    etat_cont = (chpub==1)*(titc == 3)

    colloc_stag = (chpub==2)*(titc == 1)
    colloc_tit  = (chpub==2)*(titc == 2)
    colloc_cont = (chpub==2)*(titc == 3)


    hosp_stag = (chpub==2)*(titc == 1)
    hosp_tit  = (chpub==2)*(titc == 2)
    hosp_cont = (chpub==2)*(titc == 3)

    contract = (colloc_cont + hosp_cont + etat_cont) > 1
    
    colloc_tit2 = (colloc_tit + hosp_tit ) > 1
    
    return 1*cadre + 2*etat_tit + 3*colloc_tit2 + 4*contract 



def build_pat(_P):
    '''
    Builds pat from P.cotsoc.pat
    '''
    plaf_ss = 12*_P.cotsoc.gen.plaf_ss
    
    pat = scaleBaremes(BaremeDict('pat', _P.cotsoc.pat), plaf_ss)

    pat['noncadre'].update(pat['commun'])
    pat['cadre'].update(pat['commun'])
    
    pat['fonc']['contract'].update(pat['commun'])

    for var in ["maladie", "apprentissage", "apprentissage2", "vieillesseplaf", "vieillessedeplaf", "formprof", "chomfg", "construction","assedic"]:
        del pat['commun'][var]
        
    for var in ["apprentissage", "apprentissage2", "formprof", "chomfg", "construction","assedic"]:
        del pat['fonc']['contract'][var]

    pat['fonc']['etat'].update(pat['commun'])
    pat['fonc']['colloc'].update(pat['commun'])
    
    
    del pat['commun']

    pat['etat_t'] = pat['fonc']['etat']
    pat['colloc_t'] = pat['fonc']['colloc']

    pat['contract'] =  pat['fonc']['contract']
    
    del pat['fonc']['etat']
    del pat['fonc']['colloc']
    

# TODO manque transport

    return pat


def _cotpat_contrib(salbrut, hsup, type_sal, _P):
    '''
    Cotisation sociales patronales contributives
    '''
    pat = build_pat(_P)
    cotpat = zeros(len(salbrut))
    for categ in CAT:
        iscat = (type_sal == categ[1])
        for bar in pat[categ[0]].itervalues():
            is_contrib = (bar.option == "contrib")
            temp = - (iscat*bar.calc(salbrut))*is_contrib
            cotpat += temp
    return cotpat

def _cotpat_noncontrib(salbrut, hsup, type_sal, _P):
    '''
    Cotisation sociales patronales non contributives
    '''
    pat = build_pat(_P)
    cotpat = zeros(len(salbrut))
    for categ in CAT:
        iscat = (type_sal == categ[1])
        for bar in pat[categ[0]].itervalues(): 
            is_noncontrib = (bar.option == "noncontrib")
            temp = - (iscat*bar.calc(salbrut))*is_noncontrib
            cotpat += temp
    return cotpat


def _cotpat(cotpat_contrib, cotpat_noncontrib):
    '''
    Cotisations sociales patronales
    '''
    return cotpat_contrib + cotpat_noncontrib


def build_sal(_P):
    '''
    Builds sal from P.cotsoc.pat
    '''
    plaf_ss = 12*_P.cotsoc.gen.plaf_ss
    
    sal = scaleBaremes(BaremeDict('sal', _P.cotsoc.sal), plaf_ss)
    sal['noncadre'].update(sal['commun'])
    sal['cadre'].update(sal['commun'])
    sal['etat_t'] = sal['fonc']['etat']
    sal['colloc_t'] = sal['fonc']['colloc']
    sal['contract']   = sal['fonc']['contract']

    sal['contract'].update(sal['commun'])
    del sal['contract']['arrco']
    del sal['contract']['assedic'] 
    sal['contract']['solidarite'] = sal['fonc']['commun']['solidarite']

    del sal['fonc']['etat']
    del sal['fonc']['colloc']
    del sal['fonc']['contract']
    del sal['commun']

#    print 'sal etat'
#    print sal['etat_t'].keys()
#    
#    print 'sal colloc'
#    print sal['colloc_t'].keys()
    
#    print 'sal contract'
#    print sal['contract'].keys()
    
    
    return sal


def seuil_fds(_P):
    '''
    Calcul du seuil mensuel d'assujetissement à la contribution au fond de solidarité 
    '''
    from math import  floor
    ind_maj_ref = _P.cotsoc.sal.fonc.commun.ind_maj_ref
    pt_ind = _P.cotsoc.sal.fonc.commun.pt_ind
    seuil_mensuel = floor(100*(pt_ind*ind_maj_ref)/12)
    return seuil_mensuel


def _cotsal_contrib(salbrut, hsup, type_sal, _P):
    '''
    Cotisations sociales salariales contributives
    '''
    sal = build_sal(_P)
    cotsal = zeros(len(salbrut))
    for categ in CAT:
        iscat = (type_sal == categ[1])
        for bar in sal[categ[0]].itervalues():
            is_contrib = (bar.option == "contrib")
            temp = - (iscat*bar.calc(salbrut-hsup))*is_contrib
            cotsal += temp
    return cotsal

def _cotsal_noncontrib(salbrut, hsup, type_sal, _P):
    '''
    Cotisations sociales salariales non-contributives
    '''
    sal = build_sal(_P)    
    cotsal = zeros(len(salbrut))
    seuil_assuj_fds = seuil_fds(_P)
    for categ in CAT:
        iscat = (type_sal == categ[1])
        for bar in sal[categ[0]].itervalues():
            is_noncontrib = (bar.option == "noncontrib")
            is_exempt_fds = (categ[0] in ['etat_t', 'colloc_t'])*(bar._name == 'solidarite')*( (salbrut-hsup) <= seuil_assuj_fds)   #TODO: check assiette voir IPP
            <commit_msg>Added a DEBUG in cotsoc to compute noncontrib only on famille and maladie<commit_after># -*- coding:utf-8 -*-
#
# This file is part of OpenFisca.
# OpenFisca is a socio-fiscal microsimulation software
# Copyright © 2011 <NAME>, <NAME>
# Licensed under the terms of the GPL (version 3 or later) license
# (see openfisca/__init__.py for details)


from __future__ import division
from src.countries.france.model.data import CAT
from numpy import maximum as max_, minimum as min_, logical_not as not_, zeros, ones
from src.lib.utils import  scaleBaremes, combineBaremes, BaremeDict


# TODO: CHECK la csg déductible en 2006 est case GH
# TODO:  la revenus soumis aux csg déductible et imposable sont en CG et BH en 2010 

#        # Heures supplémentaires exonérées
#        if not self.bareme.ir.autre.hsup_exo:
#            self.sal += self.hsup
#            self.hsup = 0*self.hsup
                        
# Exonération de CSG et de CRDS sur les revenus du chômage 
# et des préretraites si cela abaisse ces revenus sous le smic brut        
# TODO: mettre un trigger pour l'éxonération des revenus du chômage sous un smic

# TODO: RAFP assiette + prime
# TODO: pension assiette = salaire hors prime
# autres salaires + primes


# TODO: contribution patronale de prévoyance complémentaire
# Formation professionnelle (entreprise de 10 à moins de 20 salariés) salaire total 1,05%
# Formation professionnelle (entreprise de moins de 10 salariés)      salaire total 0,55%
# Taxe sur les salaries (pour ceux non-assujettis à la TVA)           salaire total 4,25% 
# TODO: accident du travail ?
    
#temp = 0
#if hasattr(P, "prelsoc"):
#    for val in P.prelsoc.__dict__.itervalues(): temp += val
#    P.prelsoc.total = temp         
#else : 
#    P.__dict__.update({"prelsoc": {"total": 0} })
#
#a = {'sal':sal, 'pat':pat, 'csg':csg, 'crds':crds, 'exo_fillon': P.cotsoc.exo_fillon, 'lps': P.lps, 'ir': P.ir, 'prelsoc': P.prelsoc}
#return Dicts2Object(**a)


DEBUG = True

def _mhsup(hsup):
    """
    Heures supplémentaires comptées négativement
    """
    return -hsup

############################################################################
## Revenus du capital
############################################################################

# revenus du capital soumis au barème
def _csg_cap_bar(rev_cap_bar, _P):
    '''
    Calcule la CSG sur les revenus du captial soumis au barème
    '''
    return - rev_cap_bar*_P.csg.capital.glob

def _crds_cap_bar(rev_cap_bar, _P):
    '''
    Calcule la CRDS sur les revenus du capital soumis au barème
    '''
    return - rev_cap_bar*_P.crds.capital

def _prelsoc_cap_bar(rev_cap_bar, _P):
    '''
    Calcule le prélèvement social sur les revenus du capital soumis au barème
    '''
    P = _P.prelsoc
    if _P.datesim.year < 2006:
        total = P.base 
    elif _P.datesim.year < 2009:    
        total = P.base + P.add
    else:    
        total = P.base + P.add + P.rsa
    return - rev_cap_bar*total

# revenus du capital soumis au prélèvement libératoire
def _csg_cap_lib(rev_cap_lib, _P):
    '''
    Calcule la CSG sur les revenus du capital soumis au prélèvement libératoire
    '''
    return - rev_cap_lib*_P.csg.capital.glob

def _crds_cap_lib(rev_cap_lib, _P):
    '''
    Calcule la CRDS sur les revenus du capital soumis au prélèvement libératoire
    '''
    return - rev_cap_lib*_P.crds.capital

def _prelsoc_cap_lib(rev_cap_lib, _P):
    '''
    Calcule le prélèvement social sur les revenus du capital soumis au prélèvement libératoire
    '''
    P = _P.prelsoc
    if _P.datesim.year < 2006:
        total = P.base 
    elif _P.datesim.year < 2009:    
        total = P.base + P.add
    else:    
        total = P.base + P.add + P.rsa
    return - rev_cap_lib*total


# TODO: non_imposabilité pour les revenus au barème
#        verse = (-csgcap_bar - crdscap_bar - prelsoccap_bar) > bareme.csg.capital.nonimp
##        verse=1
#        # CSG sur les revenus du patrimoine non imposés au barême (contributions sociales déjà prélevées)
#                
#        table.setIndiv('csgcap_bar', csgcap_bar*verse)
#        table.setIndiv('prelsoccap_bar', prelsoccap_bar*verse)
#        table.setIndiv('crdscap_bar', crdscap_bar*verse)


############################################################################
## Salaires
############################################################################

def _salbrut(sali, hsup, type_sal, _defaultP):
    '''
    Calcule le salaire brut à partir du salaire net
    '''
    plaf_ss = 12*_defaultP.cotsoc.gen.plaf_ss

    sal = scaleBaremes(BaremeDict('sal', _defaultP.cotsoc.sal), plaf_ss)
    csg = scaleBaremes(BaremeDict('csg', _defaultP.csg), plaf_ss)
    
    sal['noncadre'].update(sal['commun'])
    sal['cadre'].update(sal['commun'])


    noncadre = combineBaremes(sal['noncadre'])
    cadre    = combineBaremes(sal['cadre'])
    fonc     = combineBaremes(sal['fonc'])

    # On ajoute la CSG deductible
    noncadre.addBareme(csg['act']['deduc'])
    cadre.addBareme(csg['act']['deduc'])
    fonc.addBareme(csg['act']['deduc'])
    
    nca = noncadre.inverse()
    cad = cadre.inverse()
    fon = fonc.inverse()

    brut_nca = nca.calc(sali)
    brut_cad = cad.calc(sali)
    brut_fon = fon.calc(sali)

    salbrut = (brut_nca*(type_sal == CAT['noncadre']) + 
               brut_cad*(type_sal == CAT['cadre']) + 
               brut_fon*(type_sal == CAT['etat_t']) )
    
    return salbrut + hsup


def _type_sal(titc, statut, chpub, cadre, _P):
    '''
    Defines the type_sal of the individual
    0 noncadre
    1 cadre
    2 etat_t   : agent titualire de l'Etat
    3 colloc_t : agent titualire des collectivités locales
    4 contract : agent contractuel de l'Etat ou des collectivités locales
    
    '''
    
    cadre    = (statut ==8)*(chpub>3)*cadre 
    noncadre = (statut ==8)*(chpub>3)*not_(cadre)    

    
    etat_stag = (chpub==1)*(titc == 1)
    etat_tit  = (chpub==1)*(titc == 2)
    etat_cont = (chpub==1)*(titc == 3)

    colloc_stag = (chpub==2)*(titc == 1)
    colloc_tit  = (chpub==2)*(titc == 2)
    colloc_cont = (chpub==2)*(titc == 3)


    hosp_stag = (chpub==2)*(titc == 1)
    hosp_tit  = (chpub==2)*(titc == 2)
    hosp_cont = (chpub==2)*(titc == 3)

    contract = (colloc_cont + hosp_cont + etat_cont) > 1
    
    colloc_tit2 = (colloc_tit + hosp_tit ) > 1
    
    return 1*cadre + 2*etat_tit + 3*colloc_tit2 + 4*contract 



def build_pat(_P):
    '''
    Builds pat from P.cotsoc.pat
    '''
    plaf_ss = 12*_P.cotsoc.gen.plaf_ss
    
    pat = scaleBaremes(BaremeDict('pat', _P.cotsoc.pat), plaf_ss)

    pat['noncadre'].update(pat['commun'])
    pat['cadre'].update(pat['commun'])
    
    pat['fonc']['contract'].update(pat['commun'])

    for var in ["maladie", "apprentissage", "apprentissage2", "vieillesseplaf", "vieillessedeplaf", "formprof", "chomfg", "construction","assedic"]:
        del pat['commun'][var]
        
    for var in ["apprentissage", "apprentissage2", "formprof", "chomfg", "construction","assedic"]:
        del pat['fonc']['contract'][var]

    pat['fonc']['etat'].update(pat['commun'])
    pat['fonc']['colloc'].update(pat['commun'])
    
    
    del pat['commun']

    pat['etat_t'] = pat['fonc']['etat']
    pat['colloc_t'] = pat['fonc']['colloc']

    pat['contract'] =  pat['fonc']['contract']
    
    del pat['fonc']['etat']
    del pat['fonc']['colloc']
    

# TODO manque transport

    return pat


def _cotpat_contrib(salbrut, hsup, type_sal, _P):
    '''
    Cotisation sociales patronales contributives
    '''
    pat = build_pat(_P)
    cotpat = zeros(len(salbrut))
    for categ in CAT:
        iscat = (type_sal == categ[1])
        for bar in pat[categ[0]].itervalues():
            is_contrib = (bar.option == "contrib")
            temp = - (iscat*bar.calc(salbrut))*is_contrib
            cotpat += temp
    return cotpat

def _cotpat_noncontrib(salbrut, hsup, type_sal, _P):
    '''
    Cotisation sociales patronales non contributives
    '''
    pat = build_pat(_P)
    cotpat = zeros(len(salbrut))
    for categ in CAT:
        iscat = (type_sal == categ[1])
        for bar in pat[categ[0]].itervalues():
            is_noncontrib = (bar.option == "noncontrib")
            if DEBUG:
                is_noncontrib = ( (bar.option == "noncontrib") and (bar._name in ["famille", "maladie"] ))
            temp = - (iscat*bar.calc(salbrut))*is_noncontrib
            cotpat += temp
    return cotpat


def _cotpat(cotpat_contrib, cotpat_noncontrib):
    '''
    Cotisations sociales patronales
    '''
    return cotpat_contrib + cotpat_noncontrib


def build_sal(_P):
    '''
    Builds sal from P.cotsoc.pat
    '''
    plaf_ss = 12*_P.cotsoc.gen.plaf_ss
    
    sal = scaleBaremes(BaremeDict('sal', _P.cotsoc.sal), plaf_ss)
    sal['noncadre'].update(sal['commun'])
    sal['cadre'].update(sal['commun'])
    sal['etat_t'] = sal['fonc']['etat']
    sal['colloc_t'] = sal['fonc']['colloc']
    sal['contract']   = sal['fonc']['contract']

    sal['contract'].update(sal['commun'])
    del sal['contract']['arrco']
    del sal['contract']['assedic'] 
    sal['contract']['solidarite'] = sal['fonc']['commun']['solidarite']

    del sal['fonc']['etat']
    del sal['fonc']['colloc']
    del sal['fonc']['contract']
    del sal['commun']

#    print 'sal etat'
#    print sal['etat_t'].keys()
#    
#    print 'sal colloc'
#    print sal['colloc_t'].keys()
    
#    print 'sal contract'
#    print sal['contract'].keys()
    
    
    return sal


def seuil_fds(_P):
    '''
    Calcul du seuil mensuel d'assujetissement à la contribution au fond de solidarité 
    '''
    from math import  floor
    ind_maj_ref = _P.cotsoc.sal.fonc.commun.ind_maj_ref
    pt_ind = _P.cotsoc.sal.fonc.commun.pt_ind
    seuil_mensuel = floor(100*(pt_ind*ind_maj_ref)/12)
    return seuil_mensuel


def _cotsal_contrib(salbrut, hsup, type_sal, _P):
    '''
    Cotisations sociales salariales contributives
    '''
    sal = build_sal(_P)
    cotsal = zeros(len(salbrut))
    for categ in CAT:
        iscat = (type_sal == categ[1])
        for bar in sal[categ[0]].itervalues():
            is_contrib = (bar.option == "contrib")
            temp = - (iscat*bar.calc(salbrut-hsup))*is_contrib
            cotsal += temp
    return cotsal

def _cotsal_noncontrib(salbrut, hsup, type_sal, _P):
    '''
    Cotisations sociales salariales non-contributives
    '''
    sal = build_sal(_P)    
    cotsal = zeros(len(salbrut))
    seuil_assuj_fds = seuil_fds(_P)
    for categ in CAT:
        iscat = (type_sal == categ[1])
        for bar in sal[categ[0]].itervalues():
            is_noncontrib = (bar.option == "noncontrib")
            is_exempt_fds = (categ[0] in ['etat_t', 'colloc_t'])*(bar._name == 'solidarite')*( (salbrut-hsup) <= seuil_assuj_fds)   #TODO: check assiette voir IPP
            if DEBUG:
                is_noncontrib = ( (bar.option == "noncontrib") and (bar._name in ["famille", "maladie"] ))
{'fraction_non_alphanumeric': 0.15964944820550866, 'fraction_numerical': 0.009923026986923862, 'mean_word_length': 3.0777084515031197, 'pattern_counts': {'":': 4, '<': 17, '<?xml version=': 0, '>': 17, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4177240', 'n_tokens_mistral': 8109, 'n_tokens_neox': 7708, 'n_words': 1746}