SciELO - Scientific Electronic Library Online

 
vol.14 issue3Transmission loss allocation under combined pool and bilateral operationPrevisão de vazões médias mensais usando redes neurais nebulosas author indexsubject indexarticles search
Home Pagealphabetic serial listing  

Services on Demand

Journal

Article

Indicators

Related links

Share


Sba: Controle & Automação Sociedade Brasileira de Automatica

Print version ISSN 0103-1759

Sba Controle & Automação vol.14 no.3 Campinas July/Sept. 2003

https://doi.org/10.1590/S0103-17592003000300007 

Métodos de pontos interiores para problema de fluxo de potência ótimo DC

 

 

Aurelio R. L. OliveiraI; Secundino Soares FilhoII

IInstituto de Matemática, Estatística e Computação Científica - IMECC, UNICAMP, aurelio@ime.unicamp.br
IIFaculdade de Engenharia Elétrica e de Computação - FEEC, UNICAMP, dino@densis.fee.unicamp.br

 

 


RESUMO

Os métodos de pontos interiores primal-dual e preditor-corretor são desenvolvidos para um modelo de fluxo de potência ótimo DC onde as leis de Kirchhoff são representadas por um problema de fluxo em redes com restrições adicionais. A estrutura matricial resultante é explorada reduzindo o sistema linear a ser resolvido a um sistema da dimensão do número de barras ou, opcionalmente, do número de laços independentes, cuja matriz é invariante ao longo das iterações permitindo que o método tenha uma iteração bastante rápida. Como conseqüência, um sistema linear cuja matriz varia a cada iteração deve ser resolvido. A dimensão deste sistema se reduz ao número de geradores. Resultados numéricos com implementação em C são apresentados para sistemas testes do IEEE e sistemas brasileiros de grande porte. O método de pontos interiores se mostra bastante robusto convergindo rapidamente para todos os casos testados.

Palavras-chave: Redes elétricas, fluxo de potência ótimo, métodos de pontos interiores, programação quadrática, fluxo em redes.


ABSTRACT

The primal-dual and predictor-corrector versions of interior point methods are developed for an optimal DC power flow model where Kirchhoff law's are represented by a network flow model with surrogate constraints. The resulting matrix structure is explored reducing the linear system to be solved either to the number of buses or to the number of independent loops, leading to very fast iterations. Either matrix is invariant and can be factored off-line. As a consequence of such matrix manipulations, a linear system which changes at each iteration must be solved; its size, however, reduces to the number of generating units. Numerical results with C implementation are presented for IEEE test systems and large scale Brazilian systems. The interior point method shows to be robust, achieving fast convergence in all instances tested.

Keywords: Electrical networks, optimal power flow, interior point methods, quadratic programming, network flow models.


 

 

1 INTRODUÇÃO

O problema de fluxo de potência ótimo tem aplicação em diversos problemas de análise e operação de sistemas de potência, tais como despacho econômico, análise de confiabilidade de geração e transmissão, análise de segurança, planejamento da expansão da geração e transmissão, e programação da geração à curto prazo.

Na grande maioria dessas aplicações, a representação linearizada (DC) do fluxo de potência tem sido adotada devido a sua maior simplicidade e ao grau de precisão satisfatório dos seus resultados.

O despacho ótimo de potência ativa através de modelo DC pode ser formulado como um modelo de fluxo em redes com restrições adicionais (Carvalho et al., 1988). Uma vantagem dessa abordagem é que, com representação independente das leis de Kirchhoff, os fluxos de potência são representados explicitamente permitindo a consideração direta dos limites de transmissão como restrições e das perdas de transmissão como um critério de desempenho.

Por sua vez, técnicas de pontos interiores tem sido estudadas e utilizadas em diversas áreas de aplicação, entre elas sistemas de potência. Em particular, têm sido sugeridas para a resolução de problemas de fluxo de potência ótimo com representação AC (Granville, 1994), obtendo excelente desempenho tanto em termos de eficiência como de robustez (Momoh et al., 1999; Quintana et al., 2000).

Este artigo apresenta um modelo de despacho de potência ativa com critério quadrátivo separável usando métodos de pontos interiores. A abordagem utilizada combina as vantagens da formulação do modelo DC por fluxo em redes com a eficiência e robustez dos métodos de pontos interiores. Ela explora em profundidade a estrutura matricial particular do problema, reduzindo o sistema linear a ser resolvido à dimensão do número de barras ou de laços independentes. Em ambos os casos, a matriz resultante é invariante durante as iterações, podendo ser fatorada a priori.

Uma heurística eficiente foi também desenvolvida para obter uma matriz de laços esparsa para representar a segunda lei de Kirchhoff. Esta matriz também é calculada a priori.

Resultados numéricos envolvendo sistemas testes do IEEE e do sistema elétrico brasileiro são apresentados. Um estudo de sensibilidade foi realizado usando o sistema teste IEEE30 para destacar a natureza das soluções obtidas e a influência de alguns parâmetros. As versões primal-dual e preditor-corretor do método de pontos interiores foram implementadas e comparadas.

Os resultados mostram que ambas as versões convergem após poucas iterações para todos os testes realizados, indicando uma ferramenta eficiente e robusta para o despacho ótimo de potência ativa.

 

2 FLUXO DE POTÊNCIA ÓTIMO DC

O modelo de fluxo de potência ótimo DC pode ser expresso como o seguinte problema de fluxo em redes:

onde:
f representa o vetor de fluxo de potência ativa;
p representa o vetor de geração de potência ativa;
R representa a matriz diagonal das resistências das linhas;
H representa a componente quadrática do custo de geração;
c representa a componente linear do custo de geração;
A representa a matriz de incidência da rede de transmissão;
X representa a matriz de reatância da rede de transmissão;
d representa o vetor demanda de potência ativa;
fmax, fmin, pmax e pmin são os vetores de limites de fluxo e de geração de potência ativa;
a e b são ponderações dos objetivos a minimizar.

O sistema de transmissão é representado por um fluxo de carga DC com limites no fluxo das linhas. Para que as variáveis de geração e transmissão possam ser expressas simultaneamente no modelo, as leis de Kirchhoff para nós e ramos (2) são apresentadas separadamente (Carvalho et al., 1988). Portanto, o conjunto de restrições para este problema é linear onde, as equações em (2) representam a rede de geração/transmissão e as equações (3) representam as capacidades de geração e transmissão do sistema. No modelo utilizado as duas componentes da função objetivo (1) são quadráticas com variáveis separáveis, a primeira representando o valor econômico das perdas de transmissão e a segunda representando o custo de geração das usinas tanto térmicas quanto hidrelétricas (Soares e Salmazo, 1997).

 

3 MÉTODO DE SOLUÇÃO

Para simplificar o desenvolvimento do método faremos as seguintes alterações no modelo (1, 2 e 3):

  • As Mudanças de variáveis = f - fmin e = p - pmin;

  • As ponderações a e b terão valor unitário.

Vale notar que a adaptação do método a ser obtido para o referido modelo é trivial. Com estas alterações, obtemos o seguinte problema:

onde cf = fmin, cp = Hpmin, = - d - Afmin + pmin e = -Xfmin.

Introduzindo as variáveis de folga das restrições de capacidade obtemos (por simplicidade de notação eliminamos os tils)

Associado ao problema primal (4) temos o seguinte problema dual já com as variáveis de folga zf e zp introduzidas:

onde B = ; l = e y(p) são os elementos da variável dual y correspondentes às barras de geração.

As condições de otimalidade para os problemas (4) e (5) são dadas pela factibilidade primal e dual e pelas condições de complementaridade:

onde e representa o vetor em que todos elementos tem valor unitário e a notação F = diag(f) para matrizes diagonais é utilizada.

3.1 Método de Pontos Interiores Primal-Dual

O primeiro método de pontos interiores polinomial para programação linear foi desenvolvido por Karmarkar (1984). Após alguma controvérsia sobre o desempenho do método, diversos trabalhos mostraram que variações deste método apresentavam desempenho computacional superior ao método simplex (e.g., Adleret al., 1989; Oliveira e Lyra, 1991). Atualmente, os métodos primais-duais são considerados os mais eficientes (Wright, 1996) e o desempenho destes métodos para problemas quadráticos convexos com variáveis separáveis é similar ao desempenho apresentado para problemas lineares (Vanderbei, 1995). Em particular, o esforço por iteração é praticamente o mesmo.

O método de pontos interiores primal-dual pode ser desenvolvido através da aplicação do método de Newton às condições de otimalidade desconsiderando-se as restrições de não-negatividade e incluindo uma perturbação (m) nas condições de complementaridade. O método parte de um ponto estritamente positivo e não permite que as variáveis se tornem negativas. Obtemos assim o seguinte método onde utilizamos os vetores x = (f,p,sf,sp) e t = (zf,zp,wf,wp):

Método 3.1 (Método Primal-Dual) Dados (x0,t0) > 0 e y0 Para k = 0,1,2,..., faça

(1) Escolha sk Î [0,1) e faça mk = sk onde, n é a dimensão do vetor x e gk = (xk)'tk.

(2) Calcule a direção de Newton (Dxk,Dyk,Dtk).

(3) Calcule o tamanho dos passos primal e dual para permanecer em um ponto interior ak = min(1,k,k) onde k Î (0,1), = e = .

(4) Calcule o novo ponto xk+1 = xk + Dxk e (yk+1,tk+1) = (yk,tk) + (Dyk,Dtk).

Os parâmetros s e e o ponto inicial serão discutidos mais adiante. A direção de Newton é definida pelo seguinte sistema linear1:

onde os resíduos são dados por

3.2 Método Preditor-Corretor

No método preditor-corretor dois sistemas lineares determinam as direções. Primeiramente é calculada a direção afim (D,D,D) resolvendo o sistema linear (6) com m = 0. Em seguida, a direção desejada é obtida resolvendo o seguinte sistema linear (Mehrotra, 1992)

onde os novos resíduos são dados por

3.3 Detalhes de Implementação

Nesta seção são apresentados os parâmetros de implementação dos métodos de pontos interiores. Os seguintes parâmetros tem valor fixo: = 0,99995 e s = . Para o método preditor-corretor, m é dado pela seguinte relação: onde = (x + D)'(t + D). Entretanto, se g < 1 então m = para ambos os métodos.

O seguinte ponto inicial foi adotado:

3.3.1 Reescalamento da matriz de Reatância

Uma vantagem da equação Xf = 0 é a possibilidade de reescalar os valores das reatâncias de cada linha sem nenhuma preocupação quanto à dimensão utilizada. Em outras palavras, cada linha da matriz X pode ser multiplicada por uma constante com o único objetivo de se obter melhor estabilidade numérica dos métodos de pontos interiores. Experimentos com esta idéia deverão realizados em futuros trabalhos.

 

4 RESOLUÇÃO DO SISTEMA LINEAR

A matriz dos sistemas lineares dos métodos primal-dual e preditor-corretor é a mesma. Portando a discussão desta seção se restringirá ao sistema (6). Este sistema linear pode ter sua dimensão bastante reduzida através da eliminação de variáveis sem modificar sua estrutura esparsa. Primeiramente substituímos as variáveis de folga primais e duais:

Com estas substituições, (6) se reduz a

Somente inversas de matrizes diagonais são envolvidas. Eliminando as variáveis de geração e fluxo de potência em (7) Df = -(ra - B'Dy) e Dp = -(rb + Dy(p)) resulta em

onde r = + Bra - Drb, e D é uma matriz diagonal cujos elementos não nulos correspondem às barras de geração dados por . Novamente, somente matrizes diagonais são invertidas.

4.1 Estudo da Estrutura Matricial

O fato de a matriz B ser quadrada (desconsiderando uma linha redundante) é bastante relevante. Esta característica pode ser utilizada para reduzir o esforço computacional por iteração dos métodos de pontos interiores. Assim, se formamos a matriz não-singular = [B ej] o sistema (8) pode ser reescrito da seguinte forma:

onde incorpora o elemento diagonal retirado de D para formar . A resolução de (9) se dá em duas etapas. Na primeira um sistema linear contendo apenas a matriz ' é resolvido. Vale observar que como é quadrada a resolução do sistema com a matriz ' fica muito barata pois apenas a matriz diagonal f varia a cada iteração. Portanto, apenas uma decomposição de é necessária e pode ser realizada antes da aplicação do método iterativo. Na verdade, esta decomposição é ainda mais barata porque permite a eliminação de variáveis como veremos mais tarde.

Na segunda etapa a fórmula de Sherman-Morrison-Woodbury (Duff et al., 1986) é aplicada para a obtenção de Dy:

onde a matriz E é formada pelos vetores canônicos correspondentes aos elementos diagonais não nulos de . Consequentemente, a matriz W é fixa para uma determinada rede e pode ser calculada antes da aplicação do método iterativo.

Dada a matriz Z, (-1 + Z) pode ser calculada quase sem esforço computacional. Além disso, esta matriz pode ser decomposta pelo método de Cholesky. Note que a dimensão desta matriz é dada pelo número de geradores menos um. Observe também que a multiplicação de E ou E' por um vetor não envolve operações de ponto flutuante uma vez que as colunas de E são colunas da matriz identidade.

4.2 Utilização de uma Árvore Geradora

É possível permutar obtendo a matriz

onde T forma uma árvore geradora da rede e N contém os arcos adicionais. Além disso, podemos reordenar [T ej] de tal forma que esta matriz seja triangular. Eliminando, estas variáveis obtemos um sistema linear com a matriz XN - XT [T ej]-1N. Esta matriz tem a dimensão do número de laços independentes e pode ser decomposta antes de se iniciar o processo iterativo.

4.3 Formação da Matriz de Reatância

A forma mais esparsa da matriz de reatância é aquela em que cada laço independente é o menor possível. Estes laços são denominados elementares. Esta matriz tem a vantagem adicional de que cada arco contribui no máximo duas vezes na formação de laços para redes planares. Assim, tomando-se os laços sempre na mesma orientação, obtem-se uma matriz do tipo incidência nó-arco. Nós não temos conhecimento de nenhum método para encontrar os laços elementares de uma rede. Em Franco et al. (1994) é apresentada uma heurística para este problema.

Neste trabalho, optou-se por estudar a rede de geração-transmissão como uma árvore geradora com arcos adicionais, pois esta formação leva a uma matriz de reatância cuja estrutura pode ser explorada com eficiência. Esta matriz contém um bloco diagonal representando os arcos adicionais da árvore geradora (XN) uma vez que estes arcos participam apenas em um único laço. Portanto, podemos eliminar XN em (10) obtendo a matriz ([T ej] - NXT) - um sistema linear com a dimensão do número de barras que multiplicado por [T e]-1 resulta em I + sign()XT uma matriz simétrica em estrutura e definida positiva havendo métodos eficientes para sua decomposição (Duff et al., 1986). Outra vantagem deste procedimento é que a matriz XN - XT [T ej]-1N também torna-se definida positiva e simétrica em estrutura: XN + XTsign().

Este esquema pode ser utilizado para qualquer árvore geradora. Entretanto, a esparsidade da matriz de reatância depende da árvore utilizada. Para obter uma matriz esparsa a árvore geradora utilizada neste trabalho é construída escolhendo a barra com maior grau como a raiz e todos seus vizinhos como filhos. A barra remanescente com maior grau é então acrescentada a árvore. Este procedimento é repetido até que todas as barras façam parte da árvore. O objetivo desta heurística é obter uma árvore com profundidade pequena de forma que os laços formados pelas linhas não pertencentes a árvore contenham poucas barras.

 

5 RESULTADOS NUMÉRICOS

Todos os testes foram realizados em uma SUN ULTRA 1 utilizando a linguagem de programação C. A precisão adotada é de 10-8. Estes experimentos visam mostrar como estes métodos obtem bom desempenho principalmente quanto à velocidade e robustez.

5.1 Sistema IEEE30

A Figura 1 contém uma representação gráfica do sistema IEEE30 utilizado nos experimentos iniciais. Os dados de carga encontram-se na Tabela 1. Nestes experimentos foram adotados os valores fmin = -fmax para as linhas de transmissão e pmin = 0 para os geradores. Para simplificar a interpretação dos resultados, somente funções quadráticas puras são utilizadas, ou seja, cp = 0, e os coeficientes quadráticos são os mesmos para todos os geradores exceto o de número 5 que é duas vezes mais caro e o de número um, duas vezes mais barato.

 

 

 

 

A matriz de reatância é calculada conforme o procedimento descrito anteriormente e contém 56 elementos não nulos. É interessante comparar esta matriz com outra onde a árvore geradora tem uma profundidade muito maior, resultando em 90 elementos não nulos. Assim, para obter a mesma solução, a versão com a matriz menos esparsa necessita 85246 operações de ponto flutuante no total contra 69897 para a versão mais esparsa no mesmo número de iterações.

A matriz de reatância é calculada conforme o procedimento descrito anteriormente e contém 56 elementos não nulos. É interessante comparar esta matriz com outra onde a árvore geradora tem uma profundidade muito maior, resultando em 90 elementos não nulos. Assim, para obter a mesma solução, a versão com a matriz menos esparsa necessita 85246 operações de ponto flutuante no total contra 69897 para a versão mais esparsa no mesmo número de iterações.

As Figuras 2-3 apresentam os resultados para o sistema IEEE30 utilizando o método preditor-corretor. Em todos estes testes o tempo computacional foi de aproximadamente 0.01 segundos e o método necessitou 7 iterações na primeira situação e 6 iterações em todas as outras.

 

 

 

 

Na Figura 2 os limites de geração e transmissão foram escolhidos de tal forma que na otimalidade não existam restrições de capacidade ativas. O despacho de geração é apresentado em três situações distintas em termos das ponderações a e b da função objetivo (1):
T. Considera apenas perdas na transmissão (a = 1 e b = 0);
G. Considera apenas o custo de geração (a = 0 e b = 1);
G&T. Considera custo de geração e transmissão.

As soluções obtidas considerando somente um dos objetivos a minimizar são muito diferentes entre si uma vez que o gerador mais barato (1) está muito mais distante da maior concentração de carga que o gerador mais caro (5). Na terceira simulação, as ponderações são dadas por (a = cm e b = 1), onde cm representa o custo marginal dos geradores obtido em G que é o mesmo para todos os geradores pois nenhuma restrição de capacidade fica ativa e as perdas não são levadas em conta no balanço de potência. Esta escolha visa transformar as perdas na transmissão (MW) em unidades monetárias ($). Assim o primeiro termo na função objetivo representa o custo de geração da perda. Esta situação é similar à solução obtida considerando apenas perdas na geração, refletindo o fato que as perdas na transmissão são uma pequena fração da geração total. A solução G&T é novamente apresentada na Figura 3 para efeito de comparação.

Os próximos experimentos visam testar o desempenho do método em situações mais restritas. Na Figura 3 a capacidade de geração da Usina 1 é limitada em 60MW. Consequentemente, as outras usinas aumentaram sua geração respeitados os respectivos custos. Na mesma figura, a Usina 8 teve sua capacidade limitada a 40MW e novamente as usinas restantes aumentaram sua geração. Nas duas situações, a Usina 5 que é mais cara contribui com uma fração menor a esta nova demanda de potência. Na mesma figura, é mostrada a situação onde a linha de transmissão 2-5 é limitada em 40MW. Uma vez que existe uma grande carga na barra 5, a geração desta usina aumenta significativamente compensando a redução de geração, também significativa, da Usina 2 devido a esta restrição de transmissão.

Finalmente, para simular um sistema bastante carregado, todas as usinas foram designadas com um limite de 50MW resultando em uma capacidade total do sistema ligeiramente superior à demanda (283,4MW). Na solução encontrada, todos os geradores alcançam a capacidade máxima com excessão da Usina 5 que tem um despacho de 33,4MW. Os testes realizados com o sistema IEEE30 mostram a consistência do modelo e a eficiência e robustez do método de solução. A seguir serão apresentados resultados numéricos com sistemas de grande e médio porte.

5.2 Outros Sistemas

Na Tabela 2 os métodos primal-dual (PD) e preditor-corretor (PC) são comparados em duas situações de demanda de carga, 100% e 110% da carga básica para o sistema IEEE118. Estas cargas representam respectivamente 80% e 88% da capacidade total do sistema. Consequentemente, vários geradores atingem seu limite máximo nestes testes. Nas duas situações, o método preditor-corretor obtem desempenho superior conseguindo um tempo computacional menor mesmo considerando o maior esforço por iteração.

 

 

Na Tabela 3 temos o número de iterações e tempo computacional para diversos sistemas. Os sistemas SSE 1654 e SSE 1732 são duas representações do sistema Sul - Sudeste e Brasil 1993 representa um equivalente do sistema interconectado brasileiro. O número de iterações obtido em todos os testes é pequeno e o tempo total aumenta lentamente com o número de barras.

 

 

6 CONCLUSÕES

Este trabalho apresenta uma formulação em redes do despacho ótimo de potência ativa e o modelo resultante é resolvido por métodos de pontos interiores. Uma das vantagens desta formulação é a representação explícita do sistema de transmissão. Além disso, a estrutura particular do problema se mostrou bastante adequada aos métodos de pontos interiores uma vez que parte significativa do esforço computacional pode ser realizada a priori.

Duas características apresentadas pelo método de pontos interiores devem ser destacadas. Primeiro é a robustez. Mesmo para problemas bastante sobrecarregados, o método converge bem, sem apresentar instabilidade numérica com uma precisão maior que a necessária em uma aplicação prática. A segunda característica é a velocidade. O maior número de iterações obtido para o sistema IEEE30 foi 7 mesmo para sistemas muito carregados. Além disso, as iterações são muito rápidas permitindo a solução de sistemas de potência de grande porte em menos que 2,5 segundos. O método preditor-corretor obteve um melhor desempenho sobre o método primal-dual. O bom desempenho dos métodos de pontos interiores aplicados ao modelo de potência ótimo DC aponta para a adaptação destes resultados ao problema de pré-despacho como uma continuação natural deste trabalho.

 

AGRADECIMENTOS

Este trabalho foi parcialmente financiado pela FAPESP - Fundação de Amparo à Pesquisa do Estado de São Paulo e pelo CNPq - Conselho Nacional de Desenvolvimento Científico e Tecnológico. Os autores gostariam de agradecer também a Leonardo Nepomuceno pelas sugestões e discussão dos resultados numéricos.

 

REFERÊNCIAS

Adler, I., Resende, M. G. C., Veiga, G. e Karmarkar, N. (1989). An implementation of Karmarkar's algorithm for linear programming, Mathematical Programming 44: 297–335.        [ Links ]

Carvalho, M. F., Soares, S. e Ohishi, T. (1988). Optimal active power dispatch by network flow approach, IEEE Transactions on Power Systems 3(3): 1640– 1647.        [ Links ]

Duff, I. S., Erisman, A. M. e Reid, J. K. (1986). Direct Methods for Sparse Matrices, Clarendon Press, Oxford.         [ Links ]

Franco, P., Carvalho, M. F. e Soares, S. (1994). A network flow model for short-term hydrodominated hydrothermal scheduling problem, IEEE Transactions on Power Systems 9(2): 1016– 1021.        [ Links ]

Granville, S. (1994). Optimal reactive power dispatch through interior point methods, IEEE Transactions on Power Systems 9(1): 136–146.        [ Links ]

Karmarkar, N. (1984). A new polynomial-time algorithm for linear programming, Combinatorica 4(4): 373–395.        [ Links ]

Mehrotra, S. (1992). On the implementation of a primaldual interior point method, SIAM Journal on Optimization 2(4): 575–601.        [ Links ]

Momoh, J. A., El-Hawary, M. E. e Adapa, R. (1999). A review of selected optimal power flow literature to 1993, part II Newton, linear programming and interior point methods, IEEE Transactions on Power Systems 14(1): 105–111.        [ Links ]

Oliveira, A. R. L. e Lyra, C. (1991). Implementação de um método de pontos interiores para programação linear, SBA: Controle & Automação 3(2): 370–382.        [ Links ]

Quintana, V. H., Torres, G. L. e Medina-Palomo, J. (2000). Interiorp oint methods and theirapplications to powersy stems: A classification of publications and software codes, IEEE Transactions on Power Systems 15(1): 170–176.        [ Links ]

Soares, S. e Salmazo, C. T. (1997). Minimum loss predispatch model for hydroelectric systems, IEEE Transactions on Power Systems 12(3): 1220–1228.        [ Links ]

Vanderbei, R. J. (1995). Symmetric quasi-definite matrices, SIAM J. Optimization 5(1): 100–113.        [ Links ]

Wright, S. J. (1996). Primal–Dual Interior–Point Methods, SIAM Publications, SIAM, Philadelphia, PA, USA.        [ Links ]

 

 

Artigo submetido em 18/12/2000
1a. Revisão em 2/10/2002
Aceito sob recomendação do Ed. Assoc. Prof. José L. R. Pereira

 

 

1 O índice k será desconsiderado a partir de agora para evitar uma notação muito carregada.

Creative Commons License All the contents of this journal, except where otherwise noted, is licensed under a Creative Commons Attribution License