Código Natural/Identificação taxonômica: mudanças entre as edições

De Documentação
Sem resumo de edição
Linha 1: Linha 1:
Identificadores únicos, tais como [https://www.postgresql.org/docs/current/functions-sequence.html contadores sequenciais em bases de dados], são fundamentais para a indexação e controle de registros. O ideal, todavia, é que esse identificador traga embutida alguma informação relativa à taxonomia da entidade identificada. Isso porque '''os identificadores de grupos taxonômicos também precisam ser únicos e padronizados'''.
Identificadores únicos, tais como [https://www.postgresql.org/docs/current/functions-sequence.html contadores sequenciais em bases de dados], são fundamentais para a indexação e controle de registros. O ideal, todavia, é que esse identificador traga embutida alguma informação relativa à taxonomia da entidade identificada. Isso porque '''os identificadores de grupos taxonômicos também precisam ser únicos e padronizados'''.


A ilustração do conjunto de frutas nos ajuda  
A ilustração do conjunto de frutas ajuda a entender os agrupamentos (taxons).


==Taxonomias bit a bit==
==Taxonomias bit a bit==
Linha 7: Linha 7:
A cada prefixo pode-se expressar uma regra. Por exemplo:
A cada prefixo pode-se expressar uma regra. Por exemplo:


* Primeiro bit do ID: define se é laranja (1) ou maçã (0). <br/>Os conjuntos ''L'' dos identificadores de laranjas e ''M'' das maçãs da ilustração ao lado são definidos por: <math>L=\{1, 10\}</math> e <math>M=\{0, 00, 000, 01, 010, 011\}</math>.
*Primeiro bit do ID: define se é laranja (1) ou maçã (0). <br />Os conjuntos ''L'' dos identificadores de laranjas e ''M'' das maçãs da ilustração ao lado são definidos por: <math>L=\{1, 10\}</math> e <math>M=\{0, 00, 000, 01, 010, 011\}</math>.  


* Primeiro bit do ID de maçã:  define se é vermelha (0) ou verde (1). Portanto IDs com prefixos 00 e 01.<br/>Os conjuntos ''R'' dos identificadores de maçãs "red" e ''G'' das maçãs "green" da ilustração ao lado são definidos por: <math>R=\{0, 00, 000\} \subset M</math> e <math>G=\{01, 010, 011\} \subset M</math>. Ambos subconjuntos de ''M'', estabelecendo portanto uma hierarquia taxonômica entre as maçãs.
*Primeiro bit do ID de maçã:  especializa como vermelha (0) ou verde (1). Portanto IDs com prefixos "00" (maçã ''red''),  "01" (maçã ''green'') e "0" para maçã genérica.  Daí rotular uma maçã com  ID "0" é uma falha, é um código exclusivo de taxon. <br />Os conjuntos ''R'' dos identificadores de maçãs ''red'' e ''G'' das maçãs ''green'' da ilustração ao lado são definidos por: <math>R=\{0, 00, 000\} \subset M</math> e <math>G=\{01, 010, 011\} \subset M</math>. Ambos subconjuntos de ''M'', estabelecendo portanto uma hierarquia taxonômica entre as maçãs.


Os identificadores de frutas são livres, podem ter qualquer quantidade de bits, podem ter tamanho fixo ou variável, e não precisam percorrer uma sequência especial. '''A taxonomia só impõe a existência de prefixos e regras de interpretação para esses prefixos'''.
Os identificadores de frutas são livres, podem ter qualquer quantidade de bits, podem ter tamanho fixo ou variável, e não precisam percorrer uma sequência especial. '''A taxonomia só impõe a existência de prefixos e regras de interpretação para esses prefixos'''.
Linha 22: Linha 22:
No exemplo poderíamos no futuro '''distinguir laranjas''',  entre ''comuns'' e ''avermelhadas''. Todas elas com prefixo <code>1</code> mas reservando mais bits para futuras diferenciações: duas estratégias são possíveis:
No exemplo poderíamos no futuro '''distinguir laranjas''',  entre ''comuns'' e ''avermelhadas''. Todas elas com prefixo <code>1</code> mas reservando mais bits para futuras diferenciações: duas estratégias são possíveis:


* Se as existentes são comuns, batizamos elas de <code>10</code> e reservamos <code>11</code> para as avermelhadas. Não fica nenhuma reserva de segurança.
*Se as existentes são comuns, batizamos elas de <code>10</code> e reservamos <code>11</code> para as avermelhadas. Não fica nenhuma reserva de segurança.


* Se as existentes são misturadas, batizamos a mistura de <code>100</code> e reservamos <code>101</code> para as identificadas como comuns e <code>110</code> para as avermelhadas; ficando ainda a reserva <code>111</code> para outra eventual variedade de laranja.
*Se as existentes são misturadas, batizamos a mistura de <code>100</code> e reservamos <code>101</code> para as identificadas como comuns e <code>110</code> para as avermelhadas; ficando ainda a reserva <code>111</code> para outra eventual variedade de laranja.


Quanto maior o risco de uma futura diferenciação, maior a demanda por reserva.
Quanto maior o risco de uma futura diferenciação, maior a demanda por reserva.
===Prefixos lexicográficos===
Na sintaxe "<code>$prefixo$contador</code>", '''o prefixo é necessariamente um código''' e a contagem para identificação dos taxons é '''necessariamente lexicográfica'''. Ver função ''hsucc''  em [https://github.com/osm-codes/NaturalCodes/blob/main/src/step01def-lib_NatCod.sql step01def-lib_NatCod.sql]. Exemplos:
*Dois taxons requerem no mínimo 1 bit. O primeiro é ''hsucc''("")="0", o segundo é seu sucessor, ''hsucc''("0")="1".
*Dois taxons com reserva de 2 bits, requerindo portanto 3 bits. Com reserva balanceada: taxons "001" e "101".
*Três taxons e todos com até 5 subtaxons cada. Pode-se adotar um prefixo de 2 bits fixos para os pais, mais dois variáveis para os filhos, ou balancear valores de zero a 3*5=15 entre 4 ou mais bits.


===Contadores numéricos===
===Contadores numéricos===
Linha 33: Linha 40:
Sendo um número, podemos calcular o sucessor <code>succ($contador)</code> através da aritmética usual, <code>$contador+1</code>.
Sendo um número, podemos calcular o sucessor <code>succ($contador)</code> através da aritmética usual, <code>$contador+1</code>.


===Contadores lexicográficos===
=== Contadores lexicográficos===
Na sintaxe "<code>$prefixo$contador</code>", o contador pode ser mantido como código.
Na sintaxe "<code>$prefixo$contador</code>", o contador pode ser mantido como código.


Sendo um código, podemos calcular <code>succ($contador)</code> através do "sucessor lexicográfico" (também denominado "hierarchical successor"). Ver função ''hsucc''  em [https://github.com/osm-codes/NaturalCodes/blob/main/src/step01def-lib_NatCod.sql step01def-lib_NatCod.sql].
Sendo um código, podemos calcular <code>succ($contador)</code> através do "sucessor lexicográfico" (também denominado "hierarchical successor"). Ver função ''hsucc''  em [https://github.com/osm-codes/NaturalCodes/blob/main/src/step01def-lib_NatCod.sql step01def-lib_NatCod.sql].


==Taxonomias Base N==
==Taxonomias Base N ==
[[Arquivo:KraEtAll2019-fig03-new-bitsBase4.png|thumb|220px|Reserving 2&nbsp;bits for all taxon-prefixes, and later representation in&nbsp;Base4h.]]
[[Arquivo:KraEtAll2019-fig03-new-bitsBase4.png|thumb|220px|Reserving 2&nbsp;bits for all taxon-prefixes, and later representation in&nbsp;Base4h.]]
<!--  
<!--  
Linha 50: Linha 57:
[[Arquivo:KraEtAll2019-fig15-GreenApples.png|thumb|220px|''Green apples'', IDs na Base4h.]]
[[Arquivo:KraEtAll2019-fig15-GreenApples.png|thumb|220px|''Green apples'', IDs na Base4h.]]


A conversão para Base4h resulta na segunda coluna da tabela abaixo, com prefixos em negrito, e conjunto "Green apples" ilustrado.
A conversão para Base4h resulta na segunda coluna da tabela abaixo, com prefixos em negrito, e conjunto "Green apples" ilustrado.  


:{| class="wikitable"
:{| class="wikitable"
|'''Base2h'''
|'''Base2h'''
|'''Base4h'''
|'''Base4h'''  
|'''''Taxon'''''
|'''''Taxon'''''
|-
|-
|00     || '''0'''   || Red Apple (illustrated)
|00||'''0'''||Red Apple (illustrated)
|-
|-
|000     || '''0'''G   || Red Apple (illustrated)
|000||'''0'''G|| Red Apple (illustrated)
|-
|-
|0000   || '''0'''0   || Red Apple (illustrated)
|0000||'''0'''0||Red Apple (illustrated)
|-
|-
|0001101 || '''0'''12Q || Red Apple
|0001101||'''0'''12Q||Red Apple
|-
|-
|0010101 || '''0'''22Q || Red Apple
|0010101||'''0'''22Q||Red Apple
|-
|-
|01     || '''1'''   || Green apple (illustrated)
|01||'''1'''||Green apple (illustrated)
|-
|-
|0101   || '''1'''1   || Green apple
|0101||'''1'''1||Green apple
|-
|-
|010     || '''1'''G   || Green apple (illustrated)
|010||'''1'''G||Green apple (illustrated)
|-
|-
|011     || '''1'''Q   || Green apple (illustrated)
|011||'''1'''Q||Green apple (illustrated)
|-
|-
|10     || '''2'''   || Organge (illustrated)
|10||'''2'''||Organge (illustrated)
|-
|-
|10101   || '''2'''2Q || Organge
|10101||'''2'''2Q||Organge
|-
|-
|1011   || '''2'''3   || Organge
|1011||'''2'''3||Organge
|-
|-
|101     || '''2'''Q   || Organge (illustrated)
|101||'''2'''Q||Organge (illustrated)
|}
|}


Linha 87: Linha 94:
A sintaxe "<code>$prefixo$contador</code>" não deve ser confundida com a sintaxe interna do prefixo. Havendo necessidade de se identificar apenas os grupos taxonômicos, com sua hierarquia, podemos fazer uso do prefixo como identificador,
A sintaxe "<code>$prefixo$contador</code>" não deve ser confundida com a sintaxe interna do prefixo. Havendo necessidade de se identificar apenas os grupos taxonômicos, com sua hierarquia, podemos fazer uso do prefixo como identificador,


== Modelagem dos níveis hierárquicos ==
===Prefixo e contador ao mesmo tempo===
Exemplo. Ao identificar as partições recursivas de um quadrado, estamos identificando as células (como instâncias) e os taxons ao mesmo tempo. Abaixo usando a base4 para rotular. A célula "0" tem as filhas "00", "01", "02" e "03".
[[Arquivo:GGeohash-ilustra9-basic.png|centro|semmoldura|580x580px]]
==Modelagem dos níveis hierárquicos==
Uniforme vs heterogêneo...
Uniforme vs heterogêneo...


* Por base N de referência: exemplo do geocódigo quadrilátero que precisa preserva compatibilidade com a base4
*Por base N de referência: exemplo do geocódigo quadrilátero que precisa preserva compatibilidade com a base4
* Por agregação: ... junta 2 ou mais níveis hierárquicos da base N para obter um nível...
*Por agregação: ... junta 2 ou mais níveis hierárquicos da base N para obter um nível...

Edição das 22h45min de 16 de julho de 2023

Identificadores únicos, tais como contadores sequenciais em bases de dados, são fundamentais para a indexação e controle de registros. O ideal, todavia, é que esse identificador traga embutida alguma informação relativa à taxonomia da entidade identificada. Isso porque os identificadores de grupos taxonômicos também precisam ser únicos e padronizados.

A ilustração do conjunto de frutas ajuda a entender os agrupamentos (taxons).

Taxonomias bit a bit

Códigos binários identificando frutas individuais e sua taxonomia: laranja, maçã vermelha e maçã verde.

A cada prefixo pode-se expressar uma regra. Por exemplo:

  • Primeiro bit do ID: define se é laranja (1) ou maçã (0).
    Os conjuntos L dos identificadores de laranjas e M das maçãs da ilustração ao lado são definidos por: e .
  • Primeiro bit do ID de maçã: especializa como vermelha (0) ou verde (1). Portanto IDs com prefixos "00" (maçã red), "01" (maçã green) e "0" para maçã genérica. Daí rotular uma maçã com ID "0" é uma falha, é um código exclusivo de taxon.
    Os conjuntos R dos identificadores de maçãs red e G das maçãs green da ilustração ao lado são definidos por: e . Ambos subconjuntos de M, estabelecendo portanto uma hierarquia taxonômica entre as maçãs.

Os identificadores de frutas são livres, podem ter qualquer quantidade de bits, podem ter tamanho fixo ou variável, e não precisam percorrer uma sequência especial. A taxonomia só impõe a existência de prefixos e regras de interpretação para esses prefixos.

A sintaxe geral da cadeia de bits é simples: "$prefixo$contador". Com as variáveis prefixo e contador, tendo apenas o prefixo um tamanho definido pelas regras taxonômicas.

Reserva de bits para o prefixo do contador

No exemplo acima as laranjas fizeram uso de um prefixo de apenas 1 bit e as maçãs uso de um prefixo de 2 bits.

Se a taxonomia é sujeita a modificações, podemos reservar mais bits para cada um dos grupos taxonômicos (taxons).

No exemplo poderíamos no futuro distinguir laranjas, entre comuns e avermelhadas. Todas elas com prefixo 1 mas reservando mais bits para futuras diferenciações: duas estratégias são possíveis:

  • Se as existentes são comuns, batizamos elas de 10 e reservamos 11 para as avermelhadas. Não fica nenhuma reserva de segurança.
  • Se as existentes são misturadas, batizamos a mistura de 100 e reservamos 101 para as identificadas como comuns e 110 para as avermelhadas; ficando ainda a reserva 111 para outra eventual variedade de laranja.

Quanto maior o risco de uma futura diferenciação, maior a demanda por reserva.

Prefixos lexicográficos

Na sintaxe "$prefixo$contador", o prefixo é necessariamente um código e a contagem para identificação dos taxons é necessariamente lexicográfica. Ver função hsucc em step01def-lib_NatCod.sql. Exemplos:

  • Dois taxons requerem no mínimo 1 bit. O primeiro é hsucc("")="0", o segundo é seu sucessor, hsucc("0")="1".
  • Dois taxons com reserva de 2 bits, requerindo portanto 3 bits. Com reserva balanceada: taxons "001" e "101".
  • Três taxons e todos com até 5 subtaxons cada. Pode-se adotar um prefixo de 2 bits fixos para os pais, mais dois variáveis para os filhos, ou balancear valores de zero a 3*5=15 entre 4 ou mais bits.

Contadores numéricos

Na sintaxe "$prefixo$contador", o contador pode ser representado como número. Computacionalmente o ID é um código, seu prefixo um código (fixo ou condicional), e por fim o contador, depois de isolado (ainda como código) pode sofrer cast para um número inteiro positivo.

Sendo um número, podemos calcular o sucessor succ($contador) através da aritmética usual, $contador+1.

Contadores lexicográficos

Na sintaxe "$prefixo$contador", o contador pode ser mantido como código.

Sendo um código, podemos calcular succ($contador) através do "sucessor lexicográfico" (também denominado "hierarchical successor"). Ver função hsucc em step01def-lib_NatCod.sql.

Taxonomias Base N

Reserving 2 bits for all taxon-prefixes, and later representation in Base4h.

O caso mais simples é a Base4, com dígitos de 2 bits. É necessário então reservar no mínimo 2 bits para a taxonomia. Aqui adotamos a estratégia de reserva de apenas um bit para a diferenciação das laranjas, e mais um bit para a diferenciação das maçãs.

Green apples, IDs na Base4h.

A conversão para Base4h resulta na segunda coluna da tabela abaixo, com prefixos em negrito, e conjunto "Green apples" ilustrado.

Base2h Base4h Taxon
00 0 Red Apple (illustrated)
000 0G Red Apple (illustrated)
0000 00 Red Apple (illustrated)
0001101 012Q Red Apple
0010101 022Q Red Apple
01 1 Green apple (illustrated)
0101 11 Green apple
010 1G Green apple (illustrated)
011 1Q Green apple (illustrated)
10 2 Organge (illustrated)
10101 22Q Organge
1011 23 Organge
101 2Q Organge (illustrated)

Identificadores sem contador

A sintaxe "$prefixo$contador" não deve ser confundida com a sintaxe interna do prefixo. Havendo necessidade de se identificar apenas os grupos taxonômicos, com sua hierarquia, podemos fazer uso do prefixo como identificador,

Prefixo e contador ao mesmo tempo

Exemplo. Ao identificar as partições recursivas de um quadrado, estamos identificando as células (como instâncias) e os taxons ao mesmo tempo. Abaixo usando a base4 para rotular. A célula "0" tem as filhas "00", "01", "02" e "03".

GGeohash-ilustra9-basic.png

Modelagem dos níveis hierárquicos

Uniforme vs heterogêneo...

  • Por base N de referência: exemplo do geocódigo quadrilátero que precisa preserva compatibilidade com a base4
  • Por agregação: ... junta 2 ou mais níveis hierárquicos da base N para obter um nível...